当前位置: 首页 > news >正文

@Builder注释导致@RequestBody的前端json反序列化失败,HTTP400

项目里发生了一个bug,就是前端请求一个接口时候,报了HTTP 400 Bad Request

通常来说这个问题是前后端的参数没对齐,比如前端传了个String,但后端对应的是Integer。

所以我就排查了半天,结果没发现啥错误,有点懵。

最后发现问题出在Controller层里,@RequestBody SubmitParam。

而SubmitParam中的某一个参数,我给加上了@Data和@Builder,注释,这个@Builder注释可好,直接给我干400了,其实去掉@Builder或者加上@AllArgsConstructor和@NoArgsConstructor都可以解决这个问题。

这是为什么呢,因为@Builder算是Lombok里很常用的注释了,可以简化我们构建对象,避免大量set的语句。当你在一个类上使用@Builder注解时,Lombok会自动生成一个静态内部类Builder,将目标类的参数都复制到Builder类里,用于创建该类的实例,提供一种流畅的链式方式来构建对象。

举个例子

import lombok.Builder;@Builder
public class Person {private String name;private int age;private String address;
}// 在其他地方的代码中
Person person = Person.builder().name("John").age(30).address("123 Main St").build();

坑就在@Builder注释在目标类中创建一个私有构造函数,参数为 Builder类型。在Builder类中提供设置各个参数的方法,并返回当前对象。最后在 Builder类中提供一个 build方法,用来创建目标类的实例,并将各个参数赋值给目标类。

然而!!!!@RequestBody在接受前端传来的json反序列化为Java对象时候,会默认调用无参构造的,@Builder会给默认的无参构造器顶掉,这就会导致@RequestBody没法替我们反序列化了,就会导致400 Bad Request。

另外需要注意:
(1)如果你在类上使用了 @Builder 注解,那么你需要手动添加一个无参构造函数,否则有些序列化框架需要通过 newInstance 构造对象时会报错。
(2)如果你在类上使用了 @Builder 注解,那么你不能再在构造函数或方法上使用 @Builder 注解,否则会导致重复生成构造器类。
(3)如果你想给某个属性设置一个默认值,那么你需要在属性上使用 @Builder.Default 注解,否则默认值会被忽略。
(4)如果你想让子类继承父类的属性,那么你需要在子类的全参构造函数上使用 @Builder 注解,并且在父类上使用 @AllArgsConstructor 注解,否则子类的构造器类不会包含父类的属性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C# 委托函数 delegate
  • 基于C语言从0开始手撸MQTT协议代码连接标准的MQTT服务器,完成数据上传和命令下发响应(华为云IOT服务器)
  • PyQt ERROR:ModuleNotFoundError: No module named ‘matplotlib‘
  • Google Test 学习笔记(简称GTest)
  • Thinkphp5实现前后端通过接口通讯基本操作方法
  • 特征工程在机器学习中的重要性
  • 【JAVA开发笔记】Reids下载、安装、配置-Windows篇(超详细,含Redis可视化管理工具!!!)
  • LeetCode704 二分查找
  • Docker 搭建GitLab
  • docker centos镜像 npm安装包时报错“npm ERR! code ECONNRESET”
  • windows wsl ubuntu系统安装桌面可视化
  • LeetCode203 移除链表元素
  • 10 Vue 特性要点
  • FineBI连接MySQL5.7
  • SQL 注入漏洞详解 - Union 注入
  • CAP 一致性协议及应用解析
  • ComponentOne 2017 V2版本正式发布
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JAVA并发编程--1.基础概念
  • JSDuck 与 AngularJS 融合技巧
  • Mysql优化
  • React16时代,该用什么姿势写 React ?
  • react-native 安卓真机环境搭建
  • Redux 中间件分析
  • ucore操作系统实验笔记 - 重新理解中断
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 通信类
  • Nginx实现动静分离
  • UI设计初学者应该如何入门?
  • 国内开源镜像站点
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • # Maven错误Error executing Maven
  • # 数据结构
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #{} 和 ${}区别
  • (2)STL算法之元素计数
  • (27)4.8 习题课
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (6)设计一个TimeMap
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (ZT)薛涌:谈贫说富
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (规划)24届春招和25届暑假实习路线准备规划
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)模仿学习-完成后台管理页面查询
  • (算法)求1到1亿间的质数或素数
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (正则)提取页面里的img标签
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET Core中的去虚
  • .NET 使用 XPath 来读写 XML 文件