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字段会序列化为什么内容
    @RestControllerclass HelloController {     @PostMapping("/user")     public UserDto user(@RequestBody UserDto userDto) throws Exception {         return userDto;     }}
  • 发送申请

  • 响应内容

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

3. 解决方案

  1. 应用@JsonFormat注解

    • 阐明

      只须要在LocalDateTime字段上加上@JsonFormat注解,申明工夫的字符串格局即可

    • 示例

      须要留神的时,申请时发送的字符串格局须要跟pattern申明的字符串格局保持一致
      @Data@NoArgsConstructor@AllArgsConstructorclass UserDto {  private String userName;  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")  private LocalDateTime birthday;    }
  • 后果

    此时Spring MVC序列化LocalDateTime类型的形式的确产生了变动

  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格局

    • 响应

      此时因为注册了JavaTimeModule序列化模块,Spring MVC序列化LocalDateTime类型的形式的确产生了变动

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 公布!