@RequestBody获取到了空值

64

我已经创建了一个简单的REST服务(POST)。但是当我从Postman调用此服务时,@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"
}

我甚至在Postman中设置了Content-Typeapplication/json


2
@ResponseBody 应用于方法的输出而不是方法本身。如果您期望 JSON 值,请还包括 produces 标头值。 - 11thdimension
即使我将响应设置为void,请求中的值仍然为空。 - Geek
policy本身并不为空,你确定它包含policyNumber吗? - 11thdimension
请问您能否展示一下您的JSON请求? - Pau
你需要遵循驼峰命名法,仅在JSON中设置属性名称是不够的。 - AmanSinghal
显示剩余3条评论
17个回答

113

检查@RequestBody import

错误通常会导致问题。

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

解决问题应该是:

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

15
我的问题是从Swagger而不是Spring Framework进行导入... - Raw
7
好的,对我来说重要的是从 Swagger 导入。啊!谢谢你的建议。 - Leon
3
对我来说,Swagger 的重要性也是如此。 - kunal
2
同样的问题也出现在 Swagger 中,它阻碍了进展。 - denov
呃!花了太多时间。我在想为什么“记录”类型在另一个方法中可以正常工作,但在这里却不行。甚至尝试使用POJO类。 - Coder
显示剩余3条评论

82

尝试将 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,并使用该setter来设置您的bean对象的值。


5
我遇到了这个问题,因为我忘记创建 getter 和 setter。 - mahsa
3
我仍然遇到了这个问题。我的属性都是小写的。它获取了对象,但所有值都为null,就像这样Task{id=0, teachingHours=null, surveillanceHours=null, proofReading=null, isActive=false, isValidated=false, candidateId=null, supervisorId=null} - Panagiss
这可能会有所帮助:https://stackoverflow.com/a/76879877/9172548 - mr-possible

14

如果没有Setter,Object的值就无法被设置。


将此作为注释。 - ℛɑƒæĿᴿᴹᴿ
对我来说,缺少的是getter方法。 - Line

8
如果您无法更改JSON格式,但仍想修复此问题,请在DTO类(例如Policy)之前添加以下注释: @JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)

它现在已经被弃用了,但仍然可以工作。 - Malek Tubaisaht

8

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

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


3

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


1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

3
我在pom文件中引入了lombok,同时在我的bean上使用了lombok的注解。然而我还没有正确地在STS中安装lombok,导致了类似的问题,我的bean没有被填充。
当我移除了lombok的注解后,我的bean就被正确地填充了。
看起来是因为在STS上没有正确地安装lombok,再加上我的bean上使用了lombok的注解,才出现了这个问题。

2
如果您正在使用Lombok API,那么@ ResponseBody和@ RequestBody注释不会公开显示或提供Getter和Setter。 这就是为什么我们读取带有null值的JSON请求。
因此,您需要注释掉那些@Getter,@Setter注释以接收JSON响应并读取JSON请求对象并生成相同的getter和setter。 重新启动或热加载(使用Spring-Boot-Devtools)服务器,它应该可以正常工作。 您仍然可以将您的lombok api用于其他实体或BO。

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

你在我的案例中肯定没问题!谢谢!:( - McQuade

1
在我的情况下是一个Lombok问题。我移除了所有的lombok注释,并手动创建了构造函数、setter和getter。
作为建议,我也会将JSON设置为小写以遵循惯例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接