@RequestBody 正在获取空值

问题描述 投票:0回答:18

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

spring spring-boot spring-restcontroller
18个回答
130
投票

检查@RequestBody

import

大多数情况下错误会导致问题。

import io.swagger.v3.oas.annotations.parameters.RequestBody;

解决问题应该是

import org.springframework.web.bind.annotation.RequestBody;

84
投票

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


17
投票

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


9
投票

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

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


8
投票

如果您无权更改 JSON 格式但仍想解决此问题,请尝试添加

@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
在 DTO(示例中的策略)类之前进行注释。


3
投票

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

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

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


3
投票

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


2
投票

如果您使用Lombok Api,则没有公开可见或可用于@ResponseBody和@RequestBody注释的Getters和Setters。 这就是为什么我们读取带有 null 值的 JSON 请求。

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


2
投票

除了

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

1
投票

使用注释

org.springframework.web.bind.annotation.RequestBody
而不是
org.springframework.web.bind.annotation.ResponseBody


1
投票

就我而言,这是一个 Lombok 问题。我删除了所有 lombok 注释并手动创建了构造函数、setter 和 getter。

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


1
投票

如果你使用Lombok,你需要compileOnly和annotationProcessor 就我而言,我错过了第二个。所以我得到了所有空值

compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'

0
投票

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

public MyClass(){}

0
投票

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

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


0
投票

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


0
投票

1-使实体类属性以小写开头。 2-检查注释。 3-检查构造函数--> **实体类应该有两个构造函数。 4-检查 Getter 和 Setter。


0
投票

我知道我正在以大写形式提交请求正文,我将它们更改为小写形式,一切对我来说都很好


-1
投票

就我而言,日期格式给出不正确

© www.soinside.com 2019 - 2024. All rights reserved.