zoukankan      html  css  js  c++  java
  • SpringBoot全局时间date和localDateTime格式失效问题记录

    一、出参处理

    springBoot项目中使用注解@ResponseBody或者@RestController默认使用Json格式返回数据。

    默认返回的格式是这样的"2021-04-28T07:01:45.000+00:00",如下

     

    我们可能想要返回给前端是yyyy-MM-dd HH:mm:ss 这样的格式

    全局配置

    若此配置无效,返回的时间还是上面那种中间带‘T’的那种格式的话,

    解决方案

    实现WebMvcConfigurer的extendMessageConverters方法

         
        @Configuration
        public class DateTimeSerializerConfig implements WebMvcConfigurer {
         
            @Value("${spring.jackson.date-format}")
            private String pattern;
         
            /**
             * 时间出参序列化
             * 使用此方法, 以下 spring-boot: jackson时间格式化 配置 将会失效
             * spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
             * spring.jackson.time-zone=GMT+8
             * 原因: 会覆盖 @EnableAutoConfiguration 关于 WebMvcAutoConfiguration 的配置
             * */
            @Override
            public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
                MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
                ObjectMapper objectMapper = converter.getObjectMapper();
                // 时间格式化
                objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
                objectMapper.setDateFormat(new SimpleDateFormat(pattern));
                // 设置格式化内容
                converter.setObjectMapper(objectMapper);
                converters.add(0, converter);
            }
        }

    实现效果

    返回的时间是自己定义的格式了

     
    二、入参处理

    当我们接收时间的类型是localDateTime类型时,前端传给我们的格式是

    这样的yyyy-MM-dd HH:mm:ss

    后端会报错Caused by: java.time.format.DateTimeParseException: Text '2021-06-11 14:02:40' could not be parsed at index 10

     

    解决方案:

         
        @Configuration
        public class LocalDateTimeSerializerConfig {
         
            @Value("${spring.jackson.date-format}")
            private String pattern;
         
            /**
             * localDateTime入参转换
             * @return
             */
            @Bean
            public ObjectMapper serializingObjectMapper() {
                        JavaTimeModule module = new JavaTimeModule();
                       LocalDateTimeDeserializer dateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(pattern));
                        module.addDeserializer(LocalDateTime.class, dateTimeDeserializer);
                        return Jackson2ObjectMapperBuilder.json().modules(module)
                             .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
            }
         
         
        }

     

     
    三、出入参同时处理

    前面一和二处理的时候,都是使用了ObjectMapper来处理的,但是两个的来源不一样的,两个同时存在时会优先继承WebMvcConfigurer的。另一个会失效。

    究极处理方法:

         
        @Configuration
        public class DateTimeSerializerConfig implements WebMvcConfigurer {
         
            @Value("${spring.jackson.date-format}")
            private String pattern;
         
            /**
             * 时间处理
             * 使用此方法, 以下 spring-boot: jackson时间格式化 配置 将会失效
             * spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
             * spring.jackson.time-zone=GMT+8
             * 原因: 会覆盖 @EnableAutoConfiguration 关于 WebMvcAutoConfiguration 的配置
             * */
            @Override
            public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
                MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
         
                //localDateTime格式化
                JavaTimeModule module = new JavaTimeModule();
                LocalDateTimeDeserializer dateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(pattern));
                LocalDateTimeSerializer dateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
                module.addDeserializer(LocalDateTime.class, dateTimeDeserializer);
                module.addSerializer(LocalDateTime.class, dateTimeSerializer);
                ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().modules(module)
                        .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
         
                //date时间格式化
                objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
                objectMapper.setDateFormat(new SimpleDateFormat(pattern));
         
                // 设置格式化内容
                converter.setObjectMapper(objectMapper);
                converters.add(0, converter);
         
            }
        }

    完美解决入参出参date类型和localDateTime类型。
    ————————————————
    版权声明:本文为CSDN博主「haixin_wu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_42343505/article/details/117814346

  • 相关阅读:
    EOF ---shell编程
    Linux错误代码含义
    linux连接sybase数据库-isql
    CH7-WEB开发(集成在一起)
    [转]ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
    [转]ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)
    [转]ASP.NET MVC 入门8、ModelState与数据验证
    [转]ASP.NET MVC 入门7、Hellper与数据的提交与绑定
    [转]ASP.NET MVC 入门6、TempData
    [转]ASP.NET MVC 入门5、View与ViewData
  • 原文地址:https://www.cnblogs.com/zbliao/p/14971361.html
Copyright © 2011-2022 走看看