下面给出详细的 SpringMVC @RequestBody 为 null 问题的排查及解决攻略:
1. 问题成因
SpringMVC 中的 @RequestBody 注解会将请求的 JSON 数据转换为相应的 Java 对象。但是,当我们使用 @RequestBody 注解时,如果请求不包含 JSON 数据或者 JSON 数据格式错误,都有可能导致@RequestBody 为 null 。
2. 解决方案
2.1 确认请求头
确认请求头是否包含 Content-Type: application/json,如果没有添加该请求头,则可能会导致 @RequestBody 为 null。
示例代码:
@PostMapping(value = "/test")
public String test(@RequestBody User user) {
// ...
}
如果测试时使用 HttpClient 发送 HTTP POST 请求(HTTP 请求体为 JSON 数据),需要设置 Content-Type 为 application/json:
HttpPost request = new HttpPost(url);
request.setHeader("Content-Type", "application/json;charset=UTF-8");
request.setEntity(new StringEntity(jsonData, Charset.forName("UTF-8")));
HttpResponse response = httpClient.execute(request);
2.2 确认 JSON 数据格式
检查传递的 JSON 是否符合规范,特别是属性名是否与对象属性名相对应,是否有多余的属性和是否遗漏了某些属性。当 JSON 数据格式错误时,SpringMVC 无法将 JSON 转换为数据对象,因此 @RequestBody 为 null。
示例代码:
public class User {
private String id;
private String name;
// getter setter 省略
}
@PostMapping(value = "/test")
public String test(@RequestBody User user) {
// ...
}
传递的 JSON 数据应该为:
{
"id": "001",
"name": "Tom"
}
如果用户传递的 JSON 数据格式错误,就会导致 @RequestBody 为 null。
2.3 开启 debug 模式
开启 SpringMVC 的 debug 模式,可以看到详细的错误信息,帮助我们解决问题。
我们可以在 application.properties 文件中添加以下配置开启 debug 日志:
logging.level.org.springframework.web: DEBUG
在控制台中可以看到详细的日志信息,从而判断出是哪个环节出现了问题。
示例代码:
@PostMapping(value = "/test")
public String test(@RequestBody User user) {
// ...
}
如果请求的 JSON 数据格式不正确,则在控制台中会看到以下日志信息:
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `com.example.demo.User` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.example.demo.User` out of START_OBJECT token
这里的日志信息提示了我们 User 对象无法从传递的 JSON 数据中反序列化,因此可以认为传递的 JSON 数据格式可能有问题。
3. 总结
以上就是解决 SpringMVC @RequestBody 为 null 问题的攻略,主要包括确认请求头、确认 JSON 数据格式以及开启 debug 模式。在实际开发中,如果遇到类似的问题,可以参考以上方法进行解决。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC @RequestBody 为null问题的排查及解决 - Python技术站