慎用lombok.Builder

2024-06-01 11:04
文章标签 lombok builder 慎用

本文主要是介绍慎用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不能被正常的反序列化。

这篇关于慎用lombok.Builder的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020826

相关文章

深入了解 Lombok 的 `@SneakyThrows` 注解

在 Java 编程中,异常处理是一个重要而繁琐的任务,特别是当你需要处理受检异常(checked exceptions)时。Lombok 的 @SneakyThrows 注解为简化异常处理提供了一种便捷的方法。本文将详细探讨 @SneakyThrows 注解的工作原理、优缺点以及使用示例。 什么是 @SneakyThrows 注解? @SneakyThrows 是 Lombok 提供的一

【spring】Lombok注解:data和AllArgsConstructor

data和AllArgsConstructor Lombok 库的注解:data和AllArgsConstructor @Data@AllArgsConstructorprivate static class Key {private String tId;private String tType

提高Flash builder编译速度 (转)

提高Flash builder编译速度   2013-04-08 03:14:42|  分类: flash |  标签: |举报 |字号大中小 订阅 我们在开发过程中随着项目的不断壮大,经常会碰到编译速度过慢,IDE崩溃等令人头痛的问题,这里我总结了一下网上别人的经验,对FB进行了3点优化,效果明显  1、把 Build Auto 改成 手动 Build  2

BiometricPrompt.Builder.setDeviceCredentialAllowed(boolean)方法过时了,怎么破。

Android R中已经将该API setDeviceCredentialAllowed() 标记为@Deprecated,即API=30开始不推荐使用该API。 先来看看官方API怎么说? 明确说,请使用setAllowedAuthenticators(int)代替。 怎么用,上图API已经说的很清晰,举个栗子 int authenticators = BiometricMana

IDEA 安装lombok插件不兼容的问题及解决方法

解决:IDEA 安装lombok插件不兼容问题,plugin xxxx is incompatible 一、去官网下载最新的2024版本 地址传送通道: lombok插件官网地址https://plugins.jetbrains.com/plugin/6317-lombok/versions/stable  二、修改参数的配置 在压缩包路径 lombok-plugin -> li

myEclipse刚打开启动报Errors running builder 'DeploymentBuilder' on project '工程名' xxxNullpointException 的错误

 早上打开myEclipse就会报 Errors running builder 'DeploymentBuilder' on project '工程名' xxxNullpointException 的错误。找了半天,也没有解决方法。终于找到一个看似靠谱的博客 http://5666522.blog.51cto.com/5656522/1238898    解决了该问题 解决方法如

Lombok和MapStruct整合

说明: Lombok和MapStruct都是用来简化Java代码的组件,它可以通过AnnotationProcessor在编译时自动生成代码,简化了我们日常开发。 原理: 自从Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。 lombok本质上就是这样的

Lombok 工具中@Data注解生成hashCode()可能导致StackOverflowError情况

看了大学一位同学博客,写了内容大致就是对于一个类中出现了该类的集合,通过Lombok的@Data注解生成class文件,当创建两个这个类的对象并且互相之间引用的时候,就出现了StackOverflowError异常,即栈溢出,或者叫超出栈深度.        在Java虚拟机内存区域分为两种一种是线程共享区域,另一种是线程私有区域,而虚拟机栈就处在线程私有区域中,虚拟机栈描述的是Jav

设计模式---Builder模式

前言: 网络上有人将它定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的对象。 所以建造者模式适合于一个具有较多的零件(属性)的产品(对象)的创建过程。 构成 由五个部分构成: 1. Product:ConcreateBuilder创建该产品的内部表示并定义它的装配过程。 2. Builder接口:抽象接口,定义创建Product对象内部各个组件的操作