@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 注解,否则子类的构造器类不会包含父类的属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/385572.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RockyLinux 9 PXE Server bios+uefi 自动化部署 RockLinux 8 9

pxe server 前言 PXE(Preboot eXecution Environment,预启动执行环境)是一种网络启动协议,允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器,它提供了启动镜像和引导加载程序,…

一款基于Cortex-M0+的单片机音频编解码 - CJC2100

USBCodec芯片可以对数字音频信号进行多种处理,例如增加音量、均衡调节、音效处理等。这些处理可以通过耳机的控制按钮来实现,让用户可以根据自己的喜好来调整音频效果。USBCodec芯片还可以控制噪声和失真的水平,以提供高品质的音频输出。噪声…

机器学习笔记-02-基础线性算法认识(问题-解答自查版)

前言 以下问题以Q&A形式记录,基本上都是笔者在初学一轮后,掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系,也适合做查漏补缺和复盘。 本文可以让读者用作自查,答案在后面&#xff0…

2024世界技能大赛某省选拔赛“网络安全项目”B模块--操作系统取证解析

2024世界技能大赛某省选拔赛“网络安全项目”B模块--操作系统取证解析 任务一、操作系统取证解析:总结:任务一、操作系统取证解析: A 集团某电脑系统被恶意份子攻击并控制,怀疑其执行了破坏操作,窃取了集团内部的敏感信息,现请分析 A 集团提供的系统镜像和内存镜像,找到…

机会性加密技术:网络安全的新趋势

在当今数字化时代,网络安全已成为各行各业不可忽视的重要议题。随着网络攻击手段的不断演进,传统的加密方式已难以满足复杂多变的安全需求。机会性加密技术(Opportunistic Encryption,简称OE),作为一种新兴…

基于Qt的视频剪辑

在Qt中进行视频剪辑可以通过多种方式实现,但通常需要使用一些额外的库来处理视频数据。以下是一些常见的方法和步骤: 使用FFmpeg FFmpeg是一个非常强大的多媒体框架,可以用来处理视频和音频数据。你可以使用FFmpeg的命令行工具或者其库来实现…

skynet 入门篇

文章目录 概述1.实现了actor模型2.实现了服务器的基础组件 环境准备centosubuntumac编译安装 ActorActor模型定义组成 Actor调度工作线程流程工作线程权重工作线程执行规则 小结 概述 skynet 是一个轻量级服务器框架,而不仅仅用于游戏; 轻量级有以下几…

react18+

主要是围绕函数式组件讲,18主要用就是函数式组件,学习前先熟悉下原生js的基本使用,主要是事件 1、UI操作 1.1、书写jsx标签语言 基本写法和原生如同一则,只是放在一个方法里面返回而已,我们称这样的写法为函数式组件…

ChatTTS(文本转语音) 一键本地安装爆火语音模型

想不想让你喜欢的文章,有着一个动听的配音,没错,他就可以实现。 ChatTTS 是一款专为对话场景设计的文本转语音模型,例如 LLM 助手对话任务。它支持英语和中文两种语言。 当下爆火模型,在Git收获23.5k的Star&#xff…

面试重点---快速排序

快排单趟 快速排序是我们面试中的重点,这个知识点也很抽象,需要我们很好的掌握,而且快速排序的代码也是非常重要,需要我们懂了还不行,必须要手撕代码,学的透彻。 在研究快速排序之前,我们首先…

PyTorch 2.0 GPU Nvidia运行库的安装

【图书推荐】《PyTorch深度学习与计算机视觉实践》-CSDN博客 假设读者电脑带有NVIDIA 20 以上系列的显卡。 我们以CUDA 11.7cuDNN 8.2.0(其他更高版本的组合,读者可以执行查阅PyTorch官网获得)为例,讲解PyTorch 2.0 GPU版本的安…

【Linux】多线程4——线程同步/条件变量

1.Linux线程同步 1.1.同步概念与线程饥饿问题 先来理解同步的概念 什么是线程同步 在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程。但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地…

云服务器Ubuntu18.04进行Nginx配置

云服务器镜像版本信息:Ubuntu 18.04 server 64bit,本文记录了在改版本镜像上安装Nginx,并介绍了Nginx配置文件目录,便于后面再次有需求时进行复习。 文章目录 Nginx的安装Nginx配置文件分析 Nginx的安装 1.执行下面命令进行安装…

linux 部署flask项目

linux python环境安装: https://blog.csdn.net/weixin_41934979/article/details/140528410 1.创建虚拟环境 python3.12 -m venv .venv 2.激活环境 . .venv/bin/activate 3.安装依赖包(pip3.12 install -r requirements.txt) pip3.12 install -r requirements.txt 4.测试启…

使用git命令行的方式,将本地项目上传到远程仓库

在国内的开发环境中,git的使用是必不可少的。Git 是一款分布式版本控制系统,用于有效管理和追踪文件的变更历史及协作开发。本片文章就来介绍一下怎样使用git命令行的方式,将本地项目上传到远程仓库,虽然现在的IDE中基本都配置了g…

React类组件生命周期与this关键字

类组件生命周期 参考链接 一图胜千言(不常用的生命周期函数已隐藏) 代码: //CC1.js import { Component } from "react";export default class CC1 extends Component {constructor(props) {super(props);console.log("con…

人工智能算法工程师(高级)课程8-图像分割项目之Mask-RCNN模型的介绍与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程8-图像分割项目之Mask-RCNN模型的介绍与代码详解。Mask R-CNN模型是一种广泛应用于目标检测和实例分割的任务的深度学习框架。本文将详细介绍Mask R-CNN的原理,包括Box Regression、Classification和Mask …

追问试面试系列:开篇

我们不管做任何事情,都是需要个理由,而不是盲目去做。 为什么写这个专栏? 就像我们被面试八股文时,市面上有很多面试八股文,随便一个八股文都是500,甚至1000面试题。诸多面试题,难道我们需要一…

Node Js开发环境的搭建

前言 通过自动化繁琐的设置和配置工作,帮助开发者快速启动新项目。常见的Node脚手架工具包括Yeoman、Express Generator、Create React App等。 一、什么是脚手架 1、什么是脚手架? 脚手架在软件开发中指的是一种自动化工具或脚本,用于快速创…

谷粒商城实战笔记-72-商品服务-API-属性分组-获取分类属性分组

文章目录 一,后端接口开发Controller层修改接口接口测试 二,前端开发 这一节的内容是开发获取分类属性分组的接口。 一,后端接口开发 Controller层修改接口 修改AttrGroupController接口。 RequestMapping("/list/{catelogId}")p…