무수한 에러를 만났다.
첫 부분만 보면,
org.springframework.data.redis.serializer.SerializationException: Cannot serialize
Caused by: org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer
Caused by: java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [ex.ops.hash.HashClass]
Failed to serialize object using DefaultSerializer
org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer
Caused by: java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [ex.ops.hash.HashClass]
Hash 타입을 Spring Data Redis 로 테스트 해보고 있는데, 이를 직렬화 할 수 없다는 에러.
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
@RedisHash
public class HashClass {
@Id
private String id;
private String value;
public HashClass(String id, String value) {
this.id = id;
this.value = value;
}
public String getId() {
return id;
}
public String getValue() {
return value;
}
}
Hash 테스트용으로 만든 클래스 HashClass 이다.
id는 String, 필드로 value: String 만 가지고 있다.
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
// 밑 2줄
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
레디스 설정 객체로 가서, setHashKeySerializer와 setHashValueSerializer를 설정해주었다.
키는 String 이니 StringRedisSerializer로, 벨류는 클래스 이므로 GenericJackson2JsonRedisSerializer 로 해주었다.
그랬더니,
Cannot construct instance of `ex.ops.hash.HashClass` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
org.springframework.data.redis.serializer.SerializationException: Could not read JSON:Cannot construct instance of `ex.ops.hash.HashClass` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
이젠 이런 에러가 난다.
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
@RedisHash
public class HashClass {
@Id
private String id;
private String value;
// 여기
public HashClass() {
}
public HashClass(String id, String value) {
this.id = id;
this.value = value;
}
public String getId() {
return id;
}
public String getValue() {
return value;
}
}
HashClass 에 기본 생성자를 추가해주었다.
이제 테스트를 돌려보면,
@DisplayName("Hash 타입 테스트")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HashTypeTest {
@Autowired
RedisTemplate<String, HashClass> redisTemplate;
HashOperations<String, String, HashClass> hashOperations;
@BeforeEach
void setUp() {
hashOperations = redisTemplate.opsForHash();
redisTemplate.getConnectionFactory().getConnection().serverCommands().flushAll(); // 매 테스트 시 초기화
}
@DisplayName("Test")
@Test
void test_1() {
HashClass hashClass = new HashClass("key01", "value01");
hashOperations.put("a", hashClass.getId(), hashClass);
HashClass findHashClass = hashOperations.get("a", hashClass.getId());
Assertions.assertThat(findHashClass.getId()).isEqualTo("key01");
Assertions.assertThat(findHashClass.getValue()).isEqualTo("value01");
}
}
성공~