Spring Boot接口接收LocalDateTime参数返回400 Bad Request问题咨询
错误根因
- 你使用
@RequestParam注解接收参数,该注解仅能读取URL查询参数、表单提交参数,无法读取application/json格式的请求体内容,Spring找不到匹配的localDateTime入参,直接返回400错误。 @DateTimeFormat注解仅对查询参数、表单参数的转换生效,JSON请求体的序列化/反序列化由Jackson组件处理,该注解对JSON场景无效。
解决方案
方案1:保留JSON请求体传参(推荐)
- 定义接收请求体的DTO类,字段上加Jackson提供的
@JsonFormat注解指定时间格式:
import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDateTime; public class DateRequest { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss") private LocalDateTime localDateTime; // 补全getter、setter方法 public LocalDateTime getLocalDateTime() { return localDateTime; } public void setLocalDateTime(LocalDateTime localDateTime) { this.localDateTime = localDateTime; } }
- 调整Controller接口,用
@RequestBody注解修饰入参:
@RestController public class Controller { @PostMapping(path ="/date",consumes="application/json",produces="application/json") public String dateTime(@RequestBody DateRequest request) { return request.getLocalDateTime().toString(); } }
提示:Spring Boot 2.x及以上版本默认已集成JSR310时间类型的Jackson序列化支持,无需额外引入依赖
方案2:改用查询参数传参
如果你不需要用JSON传参,可直接将参数放到URL查询参数中,原代码不需要修改,直接调用如下地址即可:POST http://localhost:8080/date?localDateTime=2021-06-08T11:39:01
内容的提问来源于stack exchange,提问作者Steve450
相关产品推荐
相关产品推荐

