@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 请求的空值