为啥你用@JsonFormat注解反序列化LocalDateTime总失败?

简介: 最近,有个小伙伴问我:我在SpringBoot项目中,使用@JsonFormat注解标注LocalDateTime类型的字段时,LocalDateTime反序列化失败,这个我该怎么处理呢?别急,我们一起来解决这个问题。

小伙伴的疑问

微信图片_20211119160636.jpg

解答小伙伴的疑问

我们可以使用SpringBoot依赖中的@JsonFormat注解,将前端通过json传上来的时间,通过@RequestBody自动绑定到Bean里的LocalDateTime成员上。具体的绑定注解使用方法如下所示。

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", locale = "zh", timezone = "GMT+8")

出现问题的版本

我使用Spring Boot 2.0.0 时,直接在字段上加上@JsonFormat 注解就可以完成数据的绑定。

而在使用Spring Boot 1.5.8时,只在字段上加上@JsonFormat 注解,在数据绑定时无法将Date类型的数据自动转化为字符串类型的数据。

解决方法

1.将SpringBoot版本升级为2.0.0及以上。

2.如果不升级SpringBoot版本,可以按照下面的方式解决问题。

不升级SpringBoot版本,添加Jackson对Java Time的支持后,就能解决这个问题。

在pom.xml中添加:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

添加JavaConfig,自动扫描新添加的模块:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper serializingObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.findAndRegisterModules();
        return objectMapper;
    }
}

或者在application.properties添加如下配置:

spring.jackson.serialization.write-dates-as-timestamps=false

或者只注册JavaTimeModule,添加下面的Bean

@Bean
public ObjectMapper serializingObjectMapper() {
  ObjectMapper objectMapper = new ObjectMapper();
  objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
  objectMapper.registerModule(new JavaTimeModule());
  return objectMapper;
}
相关文章
|
4月前
|
Java
LocalDateTime的全局自定义序列化
LocalDateTime的全局自定义序列化
|
3月前
|
JSON Java API
jackson序列化和反序列化中的注解和扩展点大全【收藏】
jackson序列化和反序列化中的注解和扩展点大全【收藏】
|
JSON 前端开发 Java
SpringBoot - 优雅解决 SpringBoot 在 JDK8 中 LocalDateTime(反)序列化问题
SpringBoot - 优雅解决 SpringBoot 在 JDK8 中 LocalDateTime(反)序列化问题
672 0
|
存储 人工智能 前端开发
介绍实体类或对象序列化时,忽略为空属性的操作(@JsonInclude(JsonInclude.Include.NON_EMPTY))注解
介绍实体类或对象序列化时,忽略为空属性的操作(@JsonInclude(JsonInclude.Include.NON_EMPTY))注解
|
Java
LocalDateTime序列化成yyyy-MM-dd HH:mm
LocalDateTime序列化成yyyy-MM-dd HH:mm
219 0
|
JSON Java 数据格式
Java:jackson处理LocalDateTime序列化的时候报错InvalidDefinitionException
Java:jackson处理LocalDateTime序列化的时候报错InvalidDefinitionException
960 0
|
JSON 缓存 NoSQL
解决redis序列化java8 LocalDateTime
解决redis序列化java8 LocalDateTime
1188 0
解决redis序列化java8 LocalDateTime
|
Dubbo Java 应用服务中间件
HSF/Dubbo序列化时的LocalDateTime, Instant的性能问题
### 来源 在对Dubbo新版本做性能压测时,无意中发现对用例中某个TO(Transfer Object)类的一属性字段稍作修改,由Date变成LocalDateTime,结果是吞吐量由近5w变成了2w,RT由9ms升指90ms。
2866 0
|
Java fastjson 数据格式
SpringBoot使用fastjson的JsonField注解序列化Bigdecimal
SpringBoot使用fastjson的JsonField注解序列化Bigdecimal
10122 2
|
Java
MessagePack Java 0.6.X 不使用注解(annotations)来序列化
如果你不能添加 @Message 到你的定义对象中但是你还是希望进行序列化。你可以使用 register 方法来在类中启用序列化对象。 如下的代码所示: MessagePack msgpack = new MessagePack();msgpack.register(MyMessage2.class); 例如,如果 MyMessage2 类被包含到了外部的库中了。
543 0