慎用lombok.Builder

lombok是一个Java库,使用注解方式来简化 Java 代码,可以减少诸如getter、setter的方法。
它常用的注解有:

  • @Getter、@Setter、@ToString 不必多说,分别实现getter、setter、toString、hashCode等方法。
  • @Data 则是包含上面的那些,有这个可以不需要写上面的注解
  • @NoArgsConstructor 生成无参构造函数
  • @AllArgsConstructor 生成有参构造函数
  • @Builder 、@Accessors 是定义链式调用设置属性值,其中@Accessors需要配置属性(chain = true)才能使用链式调用

在使用lombok.Builder时遇到一个问题,代码如下
请求实体

import lombok.Builder;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;@Data
@Builder
public class SettingRequest {private Long id;@NotNull(message = "请选择店铺")private Integer storeId;... .../*** 配置项,json格式*/@NotBlank(message = "请填写配置项")private String configOptions;
}

controller

@PostMapping("/saveSetting")
public Result<Boolean> saveSetting(@RequestBody @Validated SettingRequest request) {Boolean res = settingService.saveSetting(request);return Result.success(res);
}

前端代码

let obj = {setting: this.form.setting, sales: this.form.other};
this.form.configOptions = JSON.stringify(obj);
saveSetting(this.form).then(res => {if(res.code === 0){this.$modal.msgSuccess("操作成功");}this.getList();
});

请求时后端直接报错

Resolved[org.springframework.http.converter.HttpMessageNotReadableException: 
JSON parse error: Cannot construct instance of `com.xxx.request.SettingRequest` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); 
nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.xxx.request.SettingRequest` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)at [Source: (PushbackInputStream); line: 1, column: 2]]

报错的原因就是无法正常反序列化,最后的解决办法是使用@Accessors(chain = true)替代@Builder即可解决。
具体原因可以分别看一下两个注解生成的代码。

  • 使用@Accessors(chain = true)编译后的代码
public SettingRequest() {
}public Long getId() {return this.id;
}@NotNull(message = "请选择店铺"
)
public Integer getStoreId() {return this.storeId;
}@NotNull(message = "请填写配置项"
)
public String getConfigOptions() {return this.configOptions;
}public SettingRequest setId(Long id) {this.id = id;return this;
}public SettingRequest setStoreId(@NotNull(message = "请选择店铺") Integer storeId) {this.storeId = storeId;return this;
}public SettingRequest setConfigOptions(@NotNull(message = "请填写配置项") String configOptions) {this.configOptions = configOptions;return this;
}//toString()
  • 使用@Builder编译后的代码
SettingRequest(Long id, @NotNull(message = "请选择店铺") Integer storeId, @NotNull(message = "请填写配置项") String configOptions) {this.id = id;this.storeId = storeId;this.configOptions = configOptions;
}public static SettingRequest.SettingRequestBuilder builder() {return new SettingRequest.SettingRequestBuilder();
}@NotNull(message = "请填写配置项"
)
public String getConfigOptions() {return this.configOptions;
}public void setConfigOptions(@NotNull(message = "请填写配置项") String configOptions) {this.configOptions = configOptions;
}public static class SettingRequestBuilder {private Long id;private Integer storeId;private String configOptions;SettingRequestBuilder() {}public SettingRequest.SettingRequestBuilder id(Long id) {this.id = id;return this;}public SettingRequest.SettingRequestBuilder storeId(@NotNull(message = "请选择店铺") Integer storeId) {this.storeId = storeId;return this;}public SettingRequest.SettingRequestBuilder configOptions(@NotNull(message = "请填写配置项") String configOptions) {this.configOptions = configOptions;return this;}public SettingRequest build() {return new SettingRequest(this.id, this.storeId, this.whiteList, this.configOptions);}// toString()}

@Builder不能被正常的反序列化。

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

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

相关文章

【linux】自定义快捷命令/脚本

linux自定义快捷命令 场景自定义命令自定义脚本 场景 深度学习经常要切换到自己环境&#xff0c;conda activate mmagic&#xff0c;但是又不想每次重复打这么多字&#xff0c;想使用快捷命令直接切换。 自定义命令 使用别名&#xff08;alias&#xff09;或自定义脚本来创建…

CEF编译打包(支持MP4播放,windows-x64版本)

CEF编译打包(支持MP4播放,x64版本) 标签&#xff08;空格分隔&#xff09;&#xff1a; CEF C Windows vs2022 文章目录 CEF编译打包(支持MP4播放,x64版本)背景一、准备工作二、编译环境准备三、具体编译流程大概流程创建工作目录init.batdown_cef.batdown_chromium.batdown_d…

先进的无人机GPS/GNSS模块解决方案

由于多星座支持和增强的信号接收能力&#xff0c;先进的GNSS模块提供了更高的精度和可靠性。集成传感器融合补偿信号中断&#xff0c;实现无缝导航。内置实时运动学(RTK)支持提供厘米级的定位精度。这些模块还优先考虑低功耗和紧凑的尺寸&#xff0c;确保更长的飞行时间和对无人…

【SpringMVC】_SpringMVC实现用户登录

目录 1、需求分析 2、接口定义 2.1 校验接口 请求参数 响应数据 2.2 查询登录用户接口 请求参数 响应数据 4、服务器代码 5、前端代码 5.1 登录页面login.html 5.2 首页页面index.html 6、运行测试 1、需求分析 用户输入账号与密码&#xff0c;后端校验密码是否正确&a…

【论文速读】Self-Rag框架,《Self-Rag: Self-reflective Retrieval augmented Generation》

关于前面的文章阅读《When to Retrieve: Teaching LLMs to Utilize Information Retrieval Effectively》&#xff0c;有网友问与Self-Rag有什么区别。 所以&#xff0c;大概看了一下Self-Rag这篇论文。 两篇文章的方法确实非常像&#xff0c;Self-Rag相对更加复杂一些。 When …

华为校招机试 - 矿车运输成本(20240522)

题目描述 露天矿采矿作业的特点是规模大,矿石和废料的移动量达到百万吨,运输成本开销较大,需要寻求一种最优的运输路径节省成本。 已知矿场可以划分成 N * M 的网格图,每个网格存在地形的差异,因此通过不同网格时,成本开销存在差异。 网格有以下 5 种类型: 标志为 S …

深度搜索算法(c++)

迷宫出口 一天Extense在森林里探险的时候不小心走入了一个迷宫&#xff0c;迷宫可以看成是由n * n的格点组成&#xff0c;每个格点只有2种状态&#xff0c; 0和1&#xff0c;前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时&#xff0c;他只能移动到东南西北(…

一些知识点

springsecurity 认证流程 usernamepasswordAuthenticationFilter:用户名密码过滤 掉用AuthenticationManager:认证管理器&#xff0c;控制整个认证流程 调用uthenticationProvider:认证提供器&#xff0c;匿名访问&#xff0c;用户名密码访问&#xff0c;不同的访问有不同的提供…

Mac逆向Electron应用

工具库 解压asar文件 第一步 找到应用文件夹位置 打开活动监视器&#xff1a; 搜索相关应用 用命令行打开刚才复制的路径即可 open Applications/XXX.app/Contents/Resources/app第二步 解压打包文件 解压asar文件

C++ 多重继承的内存布局和指针偏移

在 C 程序里&#xff0c;在有多重继承的类里面。指向派生类对象的基类指针&#xff0c;其实是指向了派生类对象里面&#xff0c;该基类对象的起始位置&#xff0c;该位置相对于派生类对象可能有偏移。偏移的大小&#xff0c;等于派生类的继承顺序表里面&#xff0c;排在该类前面…

(自适应手机端)响应式服装服饰外贸企业网站模板

(自适应手机端)响应式服装服饰外贸企业网站模板PbootCMS内核开发的网站模板&#xff0c;该模板适用于服装服饰网站、外贸网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b;自适应手机端&#xff0c;同一个后台&#xff0…

PG 窗口函数

一&#xff0c;简介 窗口函数也叫分析函数&#xff0c;也叫OLAP函数&#xff0c;通过partition by分组&#xff0c;这里的窗口表示范围&#xff0c;&#xff0c;可以不指定PARATITION BY,会将这个表当成一个大窗口。 二&#xff0c;应用场景 &#xff08;1&#xff09;用于分…

【期末速成】——计算机组成原理(1)

目录 一、什么是计算机的组成 二、冯诺依曼体系结构计算机的特点 三、计算机系统的层次结构 四、机器语言、汇编语言、高级语言, 五、 编译程序、解释程序、汇编程序 六、已知主频、CPI计算程序运行时间 一、什么是计算机的组成 计算机的组成可以分为五个部件和两个信息…

单例模式(C语言)

C语言的设计模式&#xff08;单例模式&#xff09; 单例模式&#xff08;Singleton Pattern&#xff09;是一种设计模式&#xff0c;目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 #include "stdio.h" #include "stdlib.h"// 定义一个…

Jvm(二)新生代和老年代与GC回收

目录 新生代和老年代 新生代 MinorGC 老年代&#xff08;Old Generation&#xff09; MajorGC Minor GC、Major GC 和 Full GC 三个GC具体区别和使用场景 JVM GC及内存调优的参数 调优建议 前言-与正文无关 ​ 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无…

多输入多输出非线性对象的模型预测控制—Matlab实现

本示例展示了如何在 Simulink 中设计多输入多输出对象的闭环模型预测控制。该对象有三个操纵变量和两个测量输出。 一、非线性对象的线性化 运行该示例需要同时安装 Simulink 和 Simulink Control Design。 % 检查是否同时安装了 Simulink 和 Simulink Control Design if ~m…

C语言 指针——指针变量做函数参数:错误案例分析

目录 计算最高分及其学号 计算最高分及其学号

【linux】开机调用python脚本

linux中&#xff0c;可以使用crontab 设置开机自动调用 crontab的安装在前面文章里写过了&#xff0c;不再重复 首先&#xff0c;还是进入crontab配置文件 crontab -e 进入之后&#xff0c;跟其他定时任务不同&#xff0c;只需要在时间配置那里用rebooot 这类之后的两个文件的…

2024最新群智能优化算法:红嘴蓝鹊优化器(Red-billed Blue Magpie Optimizer,RBMO)求解23个函数,提供MATLAB代码

一、红嘴蓝鹊优化器 红嘴蓝鹊优化器&#xff08;Red-billed Blue Magpie Optimizer&#xff0c;RBMO&#xff09;由Fu Shengwei 等人于2024年提出&#xff0c;其灵感来自红嘴蓝鹊的高效合作捕食行为&#xff0c;具体模拟了红嘴蓝鹊的搜索、追逐、攻击猎物和食物储存行为。 参考…

Windows Server安全配置

Windows Server操作系统安全配置&#xff0c;加固windows server。 1、密码安全 设置密码最小长度为10 开始-管理工具-本地安全策略-安全设置-账户策略-密码策略&#xff0c;修改密码长度最小值为10。 2、密码使用期限 设置密码最长使用期限为30天 开始-管理工具-本地安全策…