@RequestBody获取空值

时间:2016-08-13 18:49:55

标签: spring spring-boot spring-restcontroller

我创建了一个简单的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

12 个答案:

答案 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 定义中的不匹配也会导致这种情况