【问题标题】:@RequestBody is getting null values@RequestBody 正在获取空值
【发布时间】:2016-12-20 12:39:19
【问题描述】:

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

【问题讨论】:

  • @ResponseBody 应用于方法的输出而不是方法本身。如果您期望 JSON 值,还包括 produces 标头值。
  • 即使我将响应设为 void,请求中的值也是相同的 null
  • policy 本身不为空,你确定它包含policyNumber 吗?
  • Policy 对象中的所有值都恢复为 null。我添加了一个tostring() 方法policy bean 并检查了这个。
  • 请您向我们展示您的 json 请求吗?

标签: spring spring-boot spring-restcontroller


【解决方案1】:

尝试将 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 对象的值。

【讨论】:

  • 我遇到了这个问题,因为我忘记创建 getter 和 setter。
  • 我仍然遇到这个问题。我的属性都是小写的。它获取对象,但所有空值都像 Task{id=0, teachingHours=null, surveillanceHours=null, proofReading=null, isActive=false, isValidated=false, candidateId=null, supervisorId=null}
【解决方案2】:

检查会导致问题的@RequestBody 导入。

应该是 --> import org.springframework.web.bind.annotation.RequestBody;

【讨论】:

  • 问题中的导入不一样吗?或为您的答案提供更多详细信息
  • 我的问题是从 swagger 导入而不是 springframework...
  • 是的。对我来说,进口来自招摇。啊!感谢您的提示。
  • 对我来说,导入也是来自 swagger
【解决方案3】:

二传手会被错过。因此,没有设置对象值。

【讨论】:

  • 将此作为评论
【解决方案4】:

如果您无权更改 JSON 格式但仍想解决此问题,请尝试添加 @JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class) 在您的 DTO(示例中的策略)类之前添加注释。

【讨论】:

    【解决方案5】:

    Java 约定要求 POJO(类的属性)中的变量名必须是小写的第一个字符。

    您的 JSON 属性中有大写字母,这是导致失败的原因。

    【讨论】:

      【解决方案6】:

      我的 pom 中有 lombok,我的 bean 上有 lombok 注释。我还没有用我的 STS 正确安装 lombok,并且遇到了类似的问题,我的 bean 没有被填充。

      当我删除 lombok 注释时,我的 bean 已正确填充。

      似乎是 Lomboc 未正确安装在 STS + 我的 bean 上的 lomboc 注释的组合。

      【讨论】:

        【解决方案7】:

        如果您使用的是 Lombok Api,则 @ResponseBody 和 @RequestBody 注释没有公开可见或可用的 Getter 和 Setter。 这就是我们读取具有 null 值的 JSON 请求的原因。

        所以你需要注释那些@Getter、@Setter注解来接收JSON响应和读取JSON请求对象并生成相同的getter和setter。 重新启动或热加载(使用 Spring-Boot-Devtools)服务器,它应该可以正常工作。 您仍然可以将您的 lombok api 用于其他实体或 BO。

        【讨论】:

          【解决方案8】:

          使用注释org.springframework.web.bind.annotation.RequestBody 而不是org.springframework.web.bind.annotation.ResponseBody

          【讨论】:

            【解决方案9】:

            在我的情况下是一个龙目岛问题。我删除了所有 lombok 注释并手动创建了构造函数、setter 和 getter。

            作为建议,我还将 JSON 设置为小写以遵循约定。

            【讨论】:

              【解决方案10】:

              在我的例子中,必须定义空构造函数。

              public MyClass(){}
              

              【讨论】:

                【解决方案11】:

                除了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;
                 }
                

                【讨论】:

                  【解决方案12】:

                  有同样的问题,但就我而言,只有一个字段没有设置。请求正文对象上的日志显示它被接收为空。删除了该字段的 getter 和 setter,并使用 IDE 自动生成它们,一切正常。

                  我高度怀疑 getter 和 setter 定义中的不匹配也会导致这种情况

                  【讨论】:

                    【解决方案13】:

                    我也遇到过这个问题,但我解决问题的最佳方法是检查 json 值中每个字段初始化中第一个引号后的空格

                    【讨论】:

                      【解决方案14】:

                      见 spring PropertyNamingStrategy(UPPER_CAMEL_CASE,LOWER_CAMEL_CASE ,LOWER_CASE 等等......默认的SNAKE_CASE)。 Spring 会通过命名策略自动更改 http contorller 类参数,这可能与您的请求 json 不一致 以 SNAKE_CASE 为例,当 java 控制器类中的“myToken”时,您的客户端应该发送 my_token 而不是 myToken

                      【讨论】:

                      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
                      猜你喜欢
                      • 2020-11-23
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-07-24
                      • 2018-01-17
                      • 1970-01-01
                      • 2018-10-07
                      • 1970-01-01
                      • 2014-06-11
                      相关资源
                      最近更新 更多