Spring MVC日期序列化

1. 问题

Spring MVC默认会将LocalData,LocalDataTime,LocalTime序列化为ArrayList,将时间信息拆分后放到数组中,可能会出现反序列化错误

2. 示例

示例Spring MVC将LocalData,LocalDataTime,LocalTime序列化为什么内容
  • 序列化对象

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
      class UserDto {
    
            private String userName;
            private LocalDateTime birthday;
    
       }
  • 处理器,用于处理请求的

    请求会传入UserDTO对象,处理器返回UserDTO对象序列化后的Json字符串,通过它可以看到UserDTO中的类型为LocalDateTime的birthday字段会序列化为什么内容
    @RestController
    class HelloController {
    
         @PostMapping("/user")
         public UserDto user(@RequestBody UserDto userDto) throws Exception {
             return userDto;
         }
    
    }
  • 发送请求

file

  • 响应内容

    从响应内容可以看出,birthday被序列化为一个数组,由此可以证明Spring MVC默认将LocalDateTime序列化为数组

file

3. 解决方案

  1. 使用@JsonFormat注解

    • 说明

      只需要在LocalDateTime字段上加上@JsonFormat注解,声明时间的字符串格式即可

    • 示例

      需要注意的时,请求时发送的字符串格式需要跟pattern声明的字符串格式保持一致
      @Data
      @NoArgsConstructor
      @AllArgsConstructor
      class UserDto {
      
        private String userName;
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
        private LocalDateTime birthday;
          
      }
  • 结果

    此时Spring MVC序列化LocalDateTime类型的方式确实发生了变化

file

  1. 定制序列化方式

    • 说明

      jackson也为此提供了一整套的序列化方案,我们只需要在pom.xml中引入jackson-datatype-jsr310依赖,然后在应用主类中增加这个序列化模块,并禁用对日期以时间戳方式输出的特性即可

    • 示例

      • maven引入依赖

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency
 - 添加序列化模块

   ```java
    @Bean
    public ObjectMapper serializingObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        //禁止将Date序列化为时间戳
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.registerModule(new JavaTimeModule());//注册模块
        return objectMapper;
    }
   ```
  • 结果展示

    注意,此时字符串格式必须符合LocalDateTime的格式,为yyyy-MM-ddTHH:mm:ss,

    例如"2022-02-22T22:22:22",这样请求接收到参数才能正常转换

    • 请求

      请求是birthday的字符串格式必须是yyyy-MM-ddTHH:mm:ss格式

      file

    • 响应

      此时由于注册了JavaTimeModule序列化模块,Spring MVC序列化LocalDateTime类型的方式确实发生了变化

file

4. 总结

​ Spring MVC默认会将LocalDate,LocalDateTime,LocalTime序列化为数组,在某些场景下会出错,所以需要修改Spring MVC默认的序列化方式,序列化结果从数组转换为表示时间的字符串。

​ 上面虽然只用了LocalDateTime来举例,但是对于LocalDate,LocalTime都是通用的。

参考文章: https://blog.didispace.com/Sp...

            ​                  https://www.cnblogs.com/codecat/p/10845797.html
本文由博客一文多发平台 OpenWrite 发布!

陈晨
3 声望2 粉丝