我创建了一个简单的 REST 服务 (POST)。但是当我从邮递员 @RequestBody 调用此服务时,没有收到任何值。
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@RestController
public class Add_Policy {
@ResponseBody
@RequestMapping(value = "/Add_Policy", headers = {
"content-type=application/json" }, consumes = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)
public Policy GetIPCountry( @RequestBody Policy policy) {
System.out.println("Check value: " + policy.getPolicyNumber());
return policy;
}
}
我的java Bean对象如下:
public class Policy {
private String PolicyNumber;
private String Type;
private String Tenture;
private String SDate;
private String HName;
private String Age;
public String getPolicyNumber() {
return PolicyNumber;
}
public void setPolicyNumber(String policyNumber) {
PolicyNumber = policyNumber;
}
public String getType() {
return Type;
}
public void setType(String type) {
Type = type;
}
public String getTenture() {
return Tenture;
}
System.out.println 正在打印 null 作为 PolicyNumber 的值。
请帮我解决这个问题。
我在请求正文中传递的 JSON 是
{
"PolicyNumber": "123",
"Type": "Test",
"Tenture": "10",
"SDate": "10-July-2016",
"HName": "Test User",
"Age": "10"
}
我什至在邮递员中将
Content-Type
设置为application/json
检查@RequestBody
import
,
大多数情况下错误会导致问题。
import io.swagger.v3.oas.annotations.parameters.RequestBody;
解决问题应该是
import org.springframework.web.bind.annotation.RequestBody;
尝试将 JSON 中属性的第一个字符设置为小写。例如。
{
"policyNumber": "123",
"type": "Test",
"tenture": "10",
"sDate": "10-July-2016",
"hName": "Test User",
"age": "10"
}
基本上,Spring 使用 getter 和 setter 来设置 bean 对象的属性。它获取 JSON 对象的属性,并将其与同名的 setter 进行匹配。例如,要设置policyNumber属性,它会尝试在bean类中查找名为setpolicyNumber()的setter,并使用它来设置bean对象的值。
二传手将会被错过。因此,对象值没有被设置。
Java 约定要求 POJO 中的变量名称(类的属性)必须是第一个字符小写。
您的 JSON 属性中有大写字母,这就是导致失败的原因。
如果您无权更改 JSON 格式但仍想解决此问题,请尝试添加
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
在 DTO(示例中的策略)类之前进行注释。
我的 pom 中有 lombok,bean 上有 lombok 注释。我还没有用我的 STS 正确安装 lombok,并且有类似的问题,我的 bean 没有填充。
当我删除 lombok 注释时,我的 bean 已正确填充。
似乎 lomboc 的组合未正确安装在我的 bean 上的 STS + lomboc 注释上。
参见 spring PropertyNamingStrategy(UPPER_CAMEL_CASE,LOWER_CAMEL_CASE ,LOWER_CASE 等等...默认SNAKE_CASE)。 Spring会通过命名策略自动更改http控制器类参数,这可能与你的请求json不一致 以 SNAKE_CASE 为例,当 java 控制器类中的“myToken”时,您的客户端应该发送 my_token 而不是 myToken
如果您使用Lombok Api,则没有公开可见或可用于@ResponseBody和@RequestBody注释的Getters和Setters。 这就是为什么我们读取带有 null 值的 JSON 请求。
因此,您需要注释那些@Getter,@Setter注释来接收JSON响应和读取JSON请求对象并生成相同的getter和setter。 重新启动或热加载(使用 Spring-Boot-Devtools)服务器,它应该可以正常工作。 您仍然可以将您的 lombok api 用于其他实体或 BO。
除了
lowerCamelCasing
之外,对我来说还需要为每个 getter 和 setter 方法应用 @JsonProperty(value="your expected JSON KEY name")
并在 POJO/Bean/DTO 类下使用
this
运算符。
示例代码:
@JsonProperty(value="policyNumber")
public void setPolicyNumber(String policyNumber) {
this.policyNumber = policyNumber;
}
使用注释
org.springframework.web.bind.annotation.RequestBody
而不是 org.springframework.web.bind.annotation.ResponseBody
就我而言,这是一个 Lombok 问题。我删除了所有 lombok 注释并手动创建了构造函数、setter 和 getter。
作为建议,我还将 JSON 设置为小写以遵循约定。
如果你使用Lombok,你需要compileOnly和annotationProcessor 就我而言,我错过了第二个。所以我得到了所有空值
compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
在我的例子中,必须定义空构造函数。
public MyClass(){}
有同样的问题,但对于我的情况,只有一个字段未设置。请求主体对象上的日志显示它被接收为空。删除了该字段的 getter 和 setter,并使用 IDE 自动生成它们,一切正常。
我高度怀疑 getter 和 setter 定义不匹配也会导致这种情况
我也遇到了这个问题,但解决我的问题的最佳方法是检查 json 值中每个字段初始化中的第一个引号后的空格
1-使实体类属性以小写开头。 2-检查注释。 3-检查构造函数--> **实体类应该有两个构造函数。 4-检查 Getter 和 Setter。
我知道我正在以大写形式提交请求正文,我将它们更改为小写形式,一切对我来说都很好
就我而言,日期格式给出不正确