关于spring:Spring-MVC日期序列化问题

2次阅读

共计 1907 个字符,预计需要花费 5 分钟才能阅读完成。

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;}
    
    }
  • 发送申请

  • 响应内容

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

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 类型的形式的确产生了变动

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

正文完
 0