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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM