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

  • 相关阅读:
    LeetCode "Median of Two Sorted Arrays"
    LeetCode "Distinct Subsequences"
    LeetCode "Permutation Sequence"

    LeetCode "Linked List Cycle II"
    LeetCode "Best Time to Buy and Sell Stock III"
    LeetCode "4Sum"
    LeetCode "3Sum closest"
    LeetCode "3Sum"
    LeetCode "Container With Most Water"
  • 原文地址:https://www.cnblogs.com/zbliao/p/14971361.html
Copyright © 2011-2022 走看看