Spring Boot PUT请求中Java 8 LocalDateTime字段为Null的问题
解决Spring Boot中LocalDateTime字段反序列化后为Null的问题
你遇到的问题核心是Jackson核心库与JSR310时间模块的版本不匹配,再加上缺少明确的字段格式注解,导致LocalDateTime的反序列化逻辑没有生效——Jackson默认对无法解析的字段不会抛出异常,而是静默赋值为null,这就是为什么你看不到报错但字段始终为null的原因。下面是一步步的解决方案:
1. 统一Jackson依赖版本
你的jackson-databind版本是2.9.5,但处理Java 8时间类型的jackson-datatype-jsr310模块版本是2.8.4,版本不一致会导致模块无法被Jackson核心库正确加载,自然无法处理LocalDateTime的反序列化。
修改依赖,让两个版本保持完全一致:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.5</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.9.5</version> <!-- 和databind版本统一 --> </dependency>
2. 给POJO字段添加@JsonFormat注解
在modifyDate字段上添加@JsonFormat注解,明确指定日期格式,给Jackson提供清晰的解析规则,双重保障反序列化生效:
@Column @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS") LocalDateTime modifyDate;
3. 确认自定义ObjectMapper的有效性
你已经通过@Primary注解确保自定义的ObjectMapper被Spring优先使用,并且注册了JavaTimeModule、禁用了时间戳序列化,这部分配置是正确的。如果想简化配置,也可以去掉手动创建的ObjectMapper Bean,改用Spring Boot的自动配置,在application.properties中添加:
# 指定日期格式 spring.jackson.date-format=yyyy-MM-dd'T'HH:mm:ss.SSS # 禁用时间戳序列化 spring.jackson.serialization.write-dates-as-timestamps=false # 自动注册JSR310模块 spring.jackson.modules=com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
验证测试
修改完成后重启服务,发送你的测试请求:
[ { "id": 2, "description": "test2", "modifyDate": "2018-05-07T16:13:04.597", "modifyUser": "me" } ]
此时modifyDate字段应该能被正确解析为LocalDateTime对象,不再是null。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

