❗️문제 상황
❌ 에러 코드
@Override
public void set(String key, Object value, long ttlInMinutes) {
redisTemplate.opsForValue().set(key, value, ttlInMinutes, TimeUnit.MINUTES);
}
✉️ 에러메시지
org.springframework.data.redis.serializer.SerializationException: Could not write JSON: Java 8 date/time type `java.time.LocalDate` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: com.wsws.moduledomain.feed.question.Question["questionDate"])
at org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer.serialize(GenericJackson2JsonRedisSerializer.java:269) ~[spring-data-redis-3.3.5.jar:3.3.5]
at org.springframework.data.redis.core.AbstractOperations.rawValue(AbstractOperations.java:128) ~[spring-data-redis-3.3.5.jar:3.3.5]
at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:251) ~[spring-data-redis-3.3.5.jar:3.3.5]
at com.wsws.moduleinfra.cache.RedisCacheManager.set(RedisCacheManager.java:29) ~[main/:na]
at com.wsws.moduleapplication.feed.service.QuestionService.findQuestionByCategoryId(QuestionService.java:43) ~[main/:na]
at com.wsws.moduleapi.feed.controller.QuestionController.getDailyQuestions(QuestionController.java:32) ~[main/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
💡 원인 파악 및 해결 과정
📄 원인 파악
Jackson이 기본적으로 LocalDate를 직렬화/역직렬화하지 못해서 발생하는 오류이다.
에러메시지를 보면 다음과 같은 부분이 있다
add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310"
jsr310이라는 모듈을 추가하라고 하는데 Spring Boot Web 라이브러리 의존성을 추가하면 jsr 310은 자동 추가된다.
그럼 왜 오류가 발생할까?
💡 해결 과정
LocalDate/LocalDateTime이 있는 클래스에 어노테이션을 붙어주어야 한다.
public record QuestionFindServiceResponse(
Long questionId,
String content,
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
LocalDate questionDate
) {
public QuestionFindServiceResponse(Question question) {
this(
question.getQuestionId().getValue(),
question.getContent(),
question.getQuestionDate()
);
}
}
@JsonSerialize, @JsonDeserialize 어노테이션을 붙어줘야 정상적으로 동작한다.
✅ 참고 자료
스프링 Java 8 LocalDateTime 직렬화 역직렬화 오류(1)
redis를 적용하던 도중 이런 오류가 발생했다.이건 고민할 문제가 아니라고 판단하여 구글링을 진행하였다.Java 8 date/time type java.time.LocalDateTime not supported by default 라는 오류는LocalDataTime을
velog.io