一、问题描述
在springboot项目中使用@RequestBody注解接收POST请求中json类型的body,并将其转换为对象:
接口
@PostMapping("/createProject")
public String createProject(@RequestBody ProjectDto projectDto) {
// ...
}
DTO
package ...;
import com.alibaba.fastjson.annotation.JSONField;
public class ProjectDto {
@JSONField(name = "project_name")
private String projectName;
// ...
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
// ...
}
body
{
"project_name":"xxx",
...
}
二、效果
期望效果
body中写"project_name",后台能够接收并set到projectName字段。
实际效果
当body中写"project_name"时,打断点可以看到DTO的projectName字段为null,只有当body中写"projectName"时后台才可以正常接收。
三、解决方案
在目标字段上同时加上@JSONField注解和@JsonProperty注解
package ...;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
public class ProjectDto {
@JSONField(name = "project_name")
@JsonProperty("project_name")
private String projectName;
// ...
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
// ...
}
四、原理
@ResquestBody字段默认使用fasterxml中的converter方法将body中的json转换为对象,@JSONField注解属于fastjson,所以没有生效。
注:由于我的项目中主要使用fastjson操作json对象,所以此处额外使用了@JSONField注解保证服务端内部操作对象时能够正确转换字段名称。如果没有相关需求,只需要使用jackson即可。