SpringBoot中LocalDate字段经React传参后存储为null的问题
SpringBoot中LocalDate字段接收React传值为null的解决方法
核心问题
React前端传入的日期一般是字符串格式(如"2024-05-20"),但SpringBoot默认Jackson配置未对LocalDate类型做自动的字符串转对象处理,导致参数绑定失败,字段值为null。@NonNull(不管是Lombok的编译期注解还是其他)仅做非空校验,不负责类型转换和参数绑定,因此无效。
解决方案
1. 给实体类字段添加Jackson注解
在LocalDate字段上指定日期格式,让Jackson能正确解析前端传入的字符串:
import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDate; import javax.validation.constraints.NotNull; public class DemoEntity { // 用JSR-380的@NotNull做运行时非空校验,Lombok的@NonNull仅编译期生效 @NotNull(message = "日期不能为空") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate dateField; // getter、setter方法 }
2. 全局配置Jackson日期处理
如果多个实体类都有日期字段,推荐全局配置避免重复代码:
方式一:配置类实现
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 注册Java 8时间模块,支持LocalDate/LocalDateTime等类型 mapper.registerModule(new JavaTimeModule()); // 关闭时间戳序列化,用字符串格式输出 mapper.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return mapper; } }
方式二:配置文件实现
在application.properties中添加:
spring.jackson.date-format=yyyy-MM-dd spring.jackson.serialization.write-dates-as-timestamps=false spring.jackson.modules=com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
3. 校验前端传参格式
确保React前端传入的日期字符串和后端配置的格式一致(比如yyyy-MM-dd),示例React请求代码:
const requestData = { dateField: "2024-05-20" // 必须和后端pattern匹配 }; axios.post('/api/demo/save', requestData) .then(res => console.log(res.data));
4. 检查控制器参数绑定
确保控制器方法用@RequestBody接收实体类对象:
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoController { @PostMapping("/api/demo/save") public String saveDemo(@RequestBody DemoEntity entity) { // 业务逻辑:保存实体到MySQL return "success"; } }
额外注意
SpringBoot 2.x及以上版本默认包含jackson-datatype-jsr310依赖,无需手动引入;如果是旧版本或手动管理依赖,需添加Maven依赖:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
内容的提问来源于stack exchange,提问作者shanthini Aarthiappan
相关产品推荐
相关产品推荐

