我创建了一个简单的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
答案 0 :(得分:20)
尝试将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对象的值。
答案 1 :(得分:15)
检查将导致问题的@RequestBody导入。
应为-> import org.springframework.web.bind.annotation.RequestBody;
答案 2 :(得分:2)
塞特将被错过。因此,不设置对象值。
答案 3 :(得分:2)
如果您无权更改JSON格式,但仍想解决此问题,请尝试添加
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
在您的DTO(示例中的策略)类之前添加注释。
答案 4 :(得分:1)
Java约定要求POJO(类的属性)中的变量名必须是小写的第一个字符。
您的JSON属性中有大写字母,这是导致失败的原因。
答案 5 :(得分:1)
我的 pom 中有 lombok,bean 上有 lombok 注释。我还没有用我的 STS 正确安装 lombok,并且有类似的问题,我的 bean 没有被填充。
当我删除 lombok 注释时,我的 bean 已正确填充。
似乎是 lomboc 的组合没有正确安装在 STS 上 + 我的 bean 上的 lomboc 注释。
答案 6 :(得分:1)
如果您使用的是 Lombok Api,那么 @ResponseBody 和 @RequestBody 注释就没有公开可见或可用的 Getter 和 Setter。 这就是为什么我们读取带有 null 值的 JSON 请求。
所以你需要注释那些@Getter、@Setter 注释以接收JSON 响应和读取JSON 请求对象并生成相同的getter 和setter。 重新启动或热加载(使用 Spring-Boot-Devtools)服务器,它应该可以正常工作。 您仍然可以将 lombok api 用于其他实体或 BO。
答案 7 :(得分:0)
使用注释org.springframework.web.bind.annotation.RequestBody
而不是org.springframework.web.bind.annotation.ResponseBody
答案 8 :(得分:0)
就我而言,是龙目岛问题。我删除了所有 lombok 注释并手动创建了构造函数、setter 和 getter。
作为建议,我还将 JSON 设置为小写以遵循约定。
答案 9 :(得分:0)
就我而言,必须定义空构造函数。
public MyClass(){}
答案 10 :(得分:0)
除了 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;
}
答案 11 :(得分:0)
有同样的问题,但就我而言,只有一个字段没有被设置。请求正文对象上的日志显示它被接收为空值。删除了该字段的 getter 和 setter,并使用 IDE 自动生成它们,一切正常。
我高度怀疑 getter 和 setter 定义中的不匹配也会导致这种情况