@RequestBody 正在获取空值

Posted

技术标签:

【中文标题】@RequestBody 正在获取空值【英文标题】:@RequestBody is getting null values 【发布时间】: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 请求吗? 【参考方案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。 我仍然遇到这个问题。我的属性都是小写的。它获取对象,但所有空值都像 Taskid=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。

以上是关于@RequestBody 正在获取空值的主要内容,如果未能解决你的问题,请参考以下文章

Spring @RequestBody Mapping 将所有属性映射到来自干净 camelCase POST Postman 请求的空值

为啥@RequestBody 得到一个具有空属性的对象

如何在@ExceptionHandler(Spring REST)中获取@RequestBody

提交表单时在控制器中获取空值

@RequestBody 部分属性值获取不到参数

springboot中@RequestBody和@ReponseBody获取参数