Spring中使用@RequestBody注解接收的实体类中的某些参数为null

1、问题描述

我写完一个接口,在用postman测试的时候,发现其中有一个参数cEnterpriseId明明是有值的,但接口controller接收到的该参数为null,但其他参数都不为null的。

 

2、解决方法

我首先去百度了一下,说是由于实体类的参数命名不规范导致的,没有按照标准“驼峰法”进行参数命名。也可以在实体类相应的参数上加上@JsonProperty(value="xxx")来解决。

 

解决方法一、

加@JsonProperty注解

 

 在实体类的cEnterpriseId参数上加上@JsonProperty(value = "cEnterpriseId")就解决了。

 

解决方法二、

手动在实体类添加get / set方法

 

 

解决方法三、

 把postman传参的cEnterpriseId改成小写centerpriseId

3、产生原因

我看网上不少说产生类似的问题@RequestBody获取的参数为null是由于springboot解析器在解析json过程中出现问题,因字段名驼峰命名无法匹配字段名导致。spring框架在接收参数的时候的get()方法无法识别参数。

不过我感觉这样子说的太笼统了,无法解答我的困惑。

后来我仔细研究了一下,简单说一下我的看法和理解吧。

首先我在实体类CustomerUsecaseJourneyBO上加了@Data注解,@Data注解大家应该都熟悉,就是用来生成实体类的get和set方法并隐藏get/set方法的。

那么对于cEnterpriseId这个参数,@Data注解自动为它生成的get/set方法是这样子的:

 然后我用idea工具,自动在实体类中生成了一下cEnterpriseId的get/set方法。

 @Data生成的是getCEnterpriseId()/setCEnterpriseId(),而idea自动生成的是getcEnterpriseId()/setcEnterpriseId()。

我用postman传一个json到接口,json在传输过程中会被转为“字节流”。接口controller层的@RequestBody加在实体类参数前面,会把接收到的字节流反序列成为一个java实体类。@RequestBody在反序列化的时候给实体类赋值使用的get/set方法是同idea自动生成的get/set方法,即:getcEnterpriseId()/setcEnterpriseId()。所以@RequestBody是用setcEnterpriseId()给是实体类CustomerUsecaseJourneyBO赋值,但在CustomerUsecaseJourneyBO类中setcEnterpriseId()是不存在的,CustomerUsecaseJourneyBO类中只有setCEnterpriseId()。

setcEnterpriseId() 不等于 setCEnterpriseId()。

当然其实也可以不加@JsonProperty注解,只需修改一下postman传参的大小写就行了。

 

 

 把cEnterpriseId改成centerpriseId,因为centerpriseId对应的get/set方法是getcEnterpriseId()/setcEnterpriseId()。

梳理了一下,大致的流程是这样的

 关于json被@RequestBody反序列化给实体类的具体过程可以参考一下这篇:@RequestBody的使用_JustryDeng-CSDN博客_@requestbody

4、总结

@RequestBody反序列化实体类部分值为null,这个问题以前没有碰到过,后来经研究发现竟然是参数命名不符合“驼峰法”,cEnterpriseId对应的数据库表字段是c_enterpriseId,我的idea工具装了阿里巴巴代码规范检测插件明明检查结果是“cEnterpriseId”是一个合法的参数命名,因此是因为cEnterpriseId命名不规范导致@RequestBody反序列化set不了实体类的参数,显然也是解释不通的。

不过我也是第一次发现注解@Data生成的get/set方法和idea工具自动生成的get/set在命名上竟然会不一致。

 不过@Data生成的get/set方法是会被覆盖的。因此看来以后写实体类在加@Data注解时要多留个心眼,最好在实体类中写get/set方法,而不是通过@Data隐藏封装get/set方法。另外如果涉及前端的json的化,最好一定要加@JsonProperty。来保证实体类中的字段与json一一对应上。

5、参考资料

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: @RequestBody注解的作用是将HTTP请求的请求体(body)部分转换为Java对象,常用于处理POST请求的JSON数据。通过该注解,可以方便地将请求体的JSON数据映射为Java对象,从而方便地进行数据处理和操作。 ### 回答2: @RequestBody注解是在Spring框架使用注解,用于指示控制器方法参数应该从请求的主体获取数据。 通常,我们将请求的数据以参数的形式传递给控制器方法。但是,对于一些特定的情况,数据可能不适合作为URL参数进行传递,或者可能包含敏感信息。这时,@RequestBody注解就派上用场了。 通常情况下,Spring框架默认将请求参数映射到控制器方法的参数。但有时候,我们需要从请求的主体提取数据,而不是从URL参数或查询字符串获取。 使用@RequestBody注解可以使Spring框架将请求的主体数据绑定到控制器方法的参数上。这样,我们就可以通过在方法声明一个带有@RequestBody注解参数接收请求主体的数据。Spring将获取请求体的内容并将其转换为控制器方法参数所需的类型。 @RequestBody注解还可以与其他注解一起使用,例如@RequestParam和@PathVariable。这样可以更灵活地处理请求参数和路径变量。 总结来说,@RequestBody注解的作用是将请求的主体数据绑定到控制器方法的参数上,从而允许我们通过方法参数接收请求主体的数据。这对于处理包含敏感信息的数据或不适合作为URL参数传递的数据非常有用。 ### 回答3: @RequestBody注解Spring MVC框架的一个注解,用于指示Controller的方法参数应该从请求体获取数据。它的作用是将请求体的数据绑定到被注解的方法参数上。 使用@RequestBody注解时,框架会自动将请求体的数据进行解析,然后将解析后的数据绑定到被注解的方法参数上。通常情况下,请求体的数据是以JSON或XML的形式进行传输的,因此@RequestBody注解常用于处理接收JSON或XML格式的请求。 @RequestBody注解常用于处理POST请求,例如提交表单、上传文件或调用API等场景。通过使用注解,我们可以方便地将请求体的数据转换为实体对象或其他数据类型,然后在方法进行业务处理。在接收到请求后,框架会自动根据请求头的Content-Type来决定如何解析请求体的数据。 需要注意的是,使用@RequestBody注解时,需要结合其他注解一起使用,如@PostMapping、@PutMapping等用于指定请求路径和请求方法的注解。同时,被注解的方法参数需要具备对应的实体类或数据类型,以便能够正确地将请求体的数据进行解析和绑定。 总之,@RequestBody注解的作用是将请求体的数据解析并绑定到方法参数上,方便开发者处理请求体的数据,提高开发效率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金斗潼关

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值