慎用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

相关文章

Builder模式的实现

概念 在创建复杂对象时,将创建该对象的工作交给一个建造者,这个建造者就是一个Builder。在日常的开发中,常常看到,如下这些代码: AlertDialog的实现 AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setMessage("你好建造者");builder.setTitle

Lombok的安装

Lombok也是在无意中发现有些项目中在编写实体类时,没有编写get和set方法,通过查找资料了解到了一个模板工具Lombok,通过使用Lombox的注解可以使项目中一些重复的代码得到省略,比如@Data注解添加到类,则该类在编译的class文件中会自动生成get和set方法。 百度资料:          Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一

Android设计模式学习之Builder模式

Android设计模式学习之观察者模式 建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离。Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。 模式的使用场景 1.相同的方法,不同的执行顺序,产生不同的事件结果时; 2.多个部件或零件,都可

MyEclipse:Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project。

Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project 'myf'. java.lang.NullPointerException 此问题一般发生在Myeclipse 保存文件并自动部署时候。 Errors occurred during the buil

建造器模式(builder)

1帅气的 Builder 链式调用? 1.1普通对象的创建 1.1.1重叠构造器1.1.2javabeans模式1.2builder链式调用的好处2应用的场景3感悟 帅气的 Builder 链式调用? 1.1普通对象的创建 再说正题之前。先看一下 在日常开发中,经常可以看到这样的代码: Retrofit retrofit = new Retrofit.Builder().baseUrl(

Spring Boot启动报错Lombok supports: sun/apple javac 1.6, ECJ

版本 idea 2023.3.4 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.32</version></dependency> 解决方式 File->Settings->Build, Execution, Deployment->C

lombok常用注解使用与原理

什么是lombok 一个优秀的Java代码库,简化了Java的编码,为Java代码的精简提供了一种方式 使用方法:pom文件中引入依赖 <!--scope:provided,只在编译阶段生效,不需要打入包中--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.

com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser

在使用 Spring+ibatis2的时候遇到的这个异常。从异常本身的提示信息来看,是配置文件解析器 com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser缺少一个 parse(Ljava/io/InputStream;Ljava/util/Properties)方法。但是需要的类我都已经引进来了,并且此前在 windows+tomcat

重学java 74.Lombok的使用

少点心气,多点干劲                      —— 24.6.18 一、lombok的安装使用 1.作用:         简化javabean开发 2.使用:         a.下插件 ->如果是idea2022不用下载了,自带         b.导lombok的jar包      安装教程:  http://t.csdnimg.cn/wq9MM

IDEA中使用scene builder

一、什么是JavaFX Scene Builder?   JavaFX Scene Builder是一种可视布局工具,允许用户快速设计JavaFX应用程序用户界面,而无需编码。用户可以将UI组件拖放到工作区,修改其属性,应用样式表,并且它们正在创建的布局的FXML代码将在后台自动生成。它的结果是一个FXML文件,然后可以通过绑定到应用程序的逻辑与Java项目组合   二、安装使用Scene