Quantcast
Channel: Active questions tagged redis+java - Stack Overflow
Viewing all articles
Browse latest Browse all 2204

When attemping to cache book : Java 8 date/time type `java.time.LocalDate` not supported by default

$
0
0

When I'm trying to cache book in redis I'm running into this problem.Config classes:

@Configuration@EnableCaching@RequiredArgsConstructorpublic class CacheConfig {    private final ObjectMapper objectMapper;    @Bean    public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()                .entryTtl(Duration.ofMinutes(10))                .disableCachingNullValues()                .serializeValuesWith(RedisSerializationContext.SerializationPair                        .fromSerializer(new Jackson2JsonRedisSerializer<>(Object.class)));        return RedisCacheManager.builder(redisConnectionFactory)                .cacheDefaults(redisCacheConfiguration)                .build();    }    @Bean    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();        redisTemplate.setConnectionFactory(redisConnectionFactory);        redisTemplate.setKeySerializer(new StringRedisSerializer());        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));        redisTemplate.setDefaultSerializer(new Jackson2JsonRedisSerializer<>(Object.class));        return redisTemplate;    }    @Bean    public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {        return new Jackson2JsonRedisSerializer<>(Object.class);    }    }
@Configurationpublic class ObjectMapperConfig {    @Bean    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {        ObjectMapper objectMapper = builder.build();        objectMapper.registerModule(new JavaTimeModule());        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);        return objectMapper;    }}

Service layer(the method in which the error occurs):

    @Override    @Transactional    @Cacheable(value = "booksById", key = "#id", unless = "#result == null")    public Book getBookById(long id) throws Exception {        Book book = bookRepository.findById(id).orElseThrow(() -> new Exception("Book not found"));        String result = objectMapper.writeValueAsString(book);        log.info(result);        return book;    }

Controller layer(the method when the service layer method is called):

@GetMapping    public ResponseEntity<Book> getBook(@RequestParam long id) {        try {            return ResponseEntity.ok(bookService.getBookById(id));        } catch (Exception e) {            e.printStackTrace();            log.error(e.getMessage());            return ResponseEntity.notFound().build();        }    }

As you can see, I tried to log the error, configure the ObjectMapper, but nothing helps. I would like to ensure that I can put the book object in the redis cache and then get it out correctly.Error stack tracing and error logs:

2024-07-09T16:10:32.060+03:00  INFO 17969 --- [demo1] [nio-8080-exec-3] c.e.demo.service.book.BookServiceImpl    : {"id":1,"title":"Что-тонереальнокрутоe","description":"Этакнигаочём-тонереальнокрутом!","numberPages":100,"dateCreated":"2012-10-01","price":1212312.00,"authors":[{"id":1,"firstName":"Oleg","lastName":"Smirnov","dateOfBirthday":"1970-12-20"}]}2024-07-09T16:10:32.067+03:00 ERROR 17969 --- [demo1] [nio-8080-exec-3] c.e.demo.controllers.BookController      : 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.example.demo.entities.Book["dateCreated"])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.example.demo.entities.Book["dateCreated"])    at org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer.serialize(Jackson2JsonRedisSerializer.java:157)    at org.springframework.data.redis.serializer.DefaultRedisElementWriter.write(DefaultRedisElementWriter.java:41)    at org.springframework.data.redis.serializer.RedisSerializationContext$SerializationPair.write(RedisSerializationContext.java:292)    at org.springframework.data.redis.cache.RedisCache.serializeCacheValue(RedisCache.java:368)    at org.springframework.data.redis.cache.RedisCache.put(RedisCache.java:226)    at org.springframework.cache.interceptor.AbstractCacheInvoker.doPut(AbstractCacheInvoker.java:87)    at org.springframework.cache.interceptor.CacheAspectSupport$CachePutRequest.performCachePut(CacheAspectSupport.java:1031)    at org.springframework.cache.interceptor.CacheAspectSupport$CachePutRequest.apply(CacheAspectSupport.java:1016)    at org.springframework.cache.interceptor.CacheAspectSupport.evaluate(CacheAspectSupport.java:560)    at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433)    at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:395)    at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:74)    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)    at com.example.demo.service.book.BookServiceImpl$$SpringCGLIB$$0.getBookById(<generated>)    at com.example.demo.controllers.BookController.getBook(BookController.java:41)    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.base/java.lang.reflect.Method.invoke(Method.java:568)    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)    at com.example.demo.security.JwtFilter.doFilter(JwtFilter.java:37)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)    at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)    at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:365)    at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126)    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at com.example.demo.security.JwtFilter.doFilter(JwtFilter.java:37)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)    at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)    at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)    at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195)    at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)    at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)    at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230)    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904)    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)    at java.base/java.lang.Thread.run(Thread.java:842)Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 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.example.demo.entities.Book["dateCreated"])    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1330)    at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35)    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732)    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770)    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:183)    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:502)    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:341)    at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4799)    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsBytes(ObjectMapper.java:4065)    at org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer.serialize(Jackson2JsonRedisSerializer.java:155)    ... 118 more

Viewing all articles
Browse latest Browse all 2204

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>