记lombok@Data和@Builder一起用无法添加无参构造方法的坑
转自:https://blog.csdn.net/w605283073/article/details/89221853
今天和小伙伴讨论一个mybatis-plus的一个诡异问题,最后定位到原因竟然是lombok@Data和@Builder一起用无法添加无参构造方法引起的,非常隐蔽。
很多框架都是同反射等调用无参数构造方法来创建实例的,需要注意。
单独使用@Data注解,会生成无参数构造方法。
// IntelliJ API Decompiler stub source generated from a class file
// Implementation of methods is not available
package com.chujianyun.util;
public class Dog {
private java.lang.String name;
private java.lang.Integer age;
private java.lang.String nickName;
private java.lang.String test;
public Dog() { /* compiled code */ }
public java.lang.String getName() { /* compiled code */ }
public java.lang.Integer getAge() { /* compiled code */ }
public java.lang.String getNickName() { /* compiled code */ }
public java.lang.String getTest() { /* compiled code */ }
public void setName(java.lang.String name) { /* compiled code */ }
public void setAge(java.lang.Integer age) { /* compiled code */ }
public void setNickName(java.lang.String nickName) { /* compiled code */ }
public void setTest(java.lang.String test) { /* compiled code */ }
public boolean equals(java.lang.Object o) { /* compiled code */ }
protected boolean canEqual(java.lang.Object other) { /* compiled code */ }
public int hashCode() { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
}
单独使用@Builder注解,发现生成了全属性的构造方法。
package com.chujianyun.util;
public class Dog {
private java.lang.String name;
private java.lang.Integer age;
private java.lang.String nickName;
private java.lang.String test;
Dog(java.lang.String name, java.lang.Integer age, java.lang.String nickName, java.lang.String test) { /* compiled code */ }
public static com.chujianyun.util.Dog.DogBuilder builder() { /* compiled code */ }
public static class DogBuilder {
private java.lang.String name;
private java.lang.Integer age;
private java.lang.String nickName;
private java.lang.String test;
DogBuilder() { /* compiled code */ }
public com.chujianyun.util.Dog.DogBuilder name(java.lang.String name) { /* compiled code */ }
public com.chujianyun.util.Dog.DogBuilder age(java.lang.Integer age) { /* compiled code */ }
public com.chujianyun.util.Dog.DogBuilder nickName(java.lang.String nickName) { /* compiled code */ }
public com.chujianyun.util.Dog.DogBuilder test(java.lang.String test) { /* compiled code */ }
public com.chujianyun.util.Dog build() { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
}
}
@Data和@Builder一起用
@Data
@Builder
public class Dog {
private String name;
private Integer age;
private String nickName;
private String test;
}
效果
// IntelliJ API Decompiler stub source generated from a class file
// Implementation of methods is not available
package com.chujianyun.util;
public class Dog {
private java.lang.String name;
private java.lang.Integer age;
private java.lang.String nickName;
private java.lang.String test;
Dog(java.lang.String name, java.lang.Integer age, java.lang.String nickName, java.lang.String test) { /* compiled code */ }
public static com.chujianyun.util.Dog.DogBuilder builder() { /* compiled code */ }
public java.lang.String getName() { /* compiled code */ }
public java.lang.Integer getAge() { /* compiled code */ }
public java.lang.String getNickName() { /* compiled code */ }
public java.lang.String getTest() { /* compiled code */ }
public void setName(java.lang.String name) { /* compiled code */ }
public void setAge(java.lang.Integer age) { /* compiled code */ }
public void setNickName(java.lang.String nickName) { /* compiled code */ }
public void setTest(java.lang.String test) { /* compiled code */ }
public boolean equals(java.lang.Object o) { /* compiled code */ }
protected boolean canEqual(java.lang.Object other) { /* compiled code */ }
public int hashCode() { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public static class DogBuilder {
private java.lang.String name;
private java.lang.Integer age;
private java.lang.String nickName;
private java.lang.String test;
DogBuilder() { /* compiled code */ }
public com.chujianyun.util.Dog.DogBuilder name(java.lang.String name) { /* compiled code */ }
public com.chujianyun.util.Dog.DogBuilder age(java.lang.Integer age) { /* compiled code */ }
public com.chujianyun.util.Dog.DogBuilder nickName(java.lang.String nickName) { /* compiled code */ }
public com.chujianyun.util.Dog.DogBuilder test(java.lang.String test) { /* compiled code */ }
public com.chujianyun.util.Dog build() { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
}
}
我们发现外层的Dog类没有了默认的构造方法。
如果手动添加无参数构造方法或者用@NoArgsConstructor注解都会报错!
@Builder
@Data
@NoArgsConstructor
public class Dog {
private String name;
private Integer age;
private String nickName;
private String test;
}
正确写法如下:
@Builder
@Data
public class Dog {
private String name;
private Integer age;
private String nickName;
private String test;
@Tolerate
Dog() {}
}
解释如下
添加函数或者构造方法,让lombok假装它不存在(不感知)。
效果如下:
package com.chujianyun.util;
public class Dog {
private java.lang.String name;
private java.lang.Integer age;
private java.lang.String nickName;
private java.lang.String test;
Dog() { /* compiled code */ }
Dog(java.lang.String name, java.lang.Integer age, java.lang.String nickName, java.lang.String test) { /* compiled code */ }
public static com.chujianyun.util.Dog.DogBuilder builder() { /* compiled code */ }
public java.lang.String getName() { /* compiled code */ }
public java.lang.Integer getAge() { /* compiled code */ }
public java.lang.String getNickName() { /* compiled code */ }
public java.lang.String getTest() { /* compiled code */ }
public void setName(java.lang.String name) { /* compiled code */ }
public void setAge(java.lang.Integer age) { /* compiled code */ }
public void setNickName(java.lang.String nickName) { /* compiled code */ }
public void setTest(java.lang.String test) { /* compiled code */ }
public boolean equals(java.lang.Object o) { /* compiled code */ }
protected boolean canEqual(java.lang.Object other) { /* compiled code */ }
public int hashCode() { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public static class DogBuilder {
private java.lang.String name;
private java.lang.Integer age;
private java.lang.String nickName;
private java.lang.String test;
DogBuilder() { /* compiled code */ }
public com.chujianyun.util.Dog.DogBuilder name(java.lang.String name) { /* compiled code */ }
public com.chujianyun.util.Dog.DogBuilder age(java.lang.Integer age) { /* compiled code */ }
public com.chujianyun.util.Dog.DogBuilder nickName(java.lang.String nickName) { /* compiled code */ }
public com.chujianyun.util.Dog.DogBuilder test(java.lang.String test) { /* compiled code */ }
public com.chujianyun.util.Dog build() { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
}
}
记lombok@Data和@Builder一起用无法添加无参构造方法的坑的更多相关文章
- java~lombok里的Builder注解
lombok注解在java进行编译时进行代码的构建,对于java对象的创建工作它可以更优雅,不需要写多余的重复的代码,这对于JAVA开发人员是很重要的,在出现lombok之后,对象的创建工作更提供Bu ...
- lombok 下的@Builder注解用法
pom依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId& ...
- 详解Lombok中的@Builder用法
Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 基础使用 @Builder注释为你的类生成相对略微复杂 ...
- Lombok中的@Builder注解
1.前言 今天在看项目代码的时候, 遇到了实体类上加@Builder注解, 之前在开发的时候, 一直没有用过这个注解, 便兴致勃勃地去查了一下资料, 它也是Lombok中的注解, 我们都知道Lombo ...
- 在项目中导入lombok依赖自动生成有参,无参 空参 方法的注解
导入依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok< ...
- 使用lombok.Data编译时无法找到get/set方法
我的IDEA版本是2019.2 在使用IDEA创建了一个SpringBoot项目,其中一个实体类使用了@Data注解,但是在Service中调用的时候找不到get/set方法. 检查步骤: 1.在St ...
- 记: Spring Data Jpa @OneToMany 级联查询被动触发的问题
I have encountered a bug in using Spring Data Jpa. Specifically,when @OneToMany was used to maintain ...
- .net core 开车记:Data Protection Key 过期问题与登录页面访问慢
K8s 船还没修好,.net core 车又出了问题,开着 k8s 豪华邮轮.飚着 .net core 极品飞车的好事真是多磨. 自从我们用上 .net core ,就一直被 .net core 的一 ...
- djangorestframework+vue-cli+axios,为axios添加token作为headers踩坑记
情况是这样的,项目用的restful规范,后端用的django+djangorestframework,前端用的vue-cli框架+webpack,前端与后端交互用的axios,然后再用户登录之后,a ...
随机推荐
- centos7设置时间
1.查看时间时区 date 2.修改时区 timedatectl set-timezone Asia/Shanghai # 设置系统时区为上海 3.安装ntp 联网校准时间 yum install n ...
- 手机网页唤醒支付宝APP发送加好友验证
手机网页唤醒支付宝APP发送加好友验证 <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- 记录下vue keep-alive IOS下无法保存滚动scroll位置的问题
最近 做的项目,遇到了一点小麻烦,就是我一个页面A页面是加载 列表数据 ,B页面是展示详细信息的.A进去B时,缓存A页面. 效果 做出来 后,缓存是缓存数据 了,但是当我A页面的列表数据 好多,要滚动 ...
- 尝试在Mac/iOS上使用tcmalloc库
概述 TCMalloc 是 Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配.它具有现代化内存分配器的基本特征:对抗内存碎片. ...
- 浅谈MongoDB基础及架构
1.简述MongDB是一个强大.灵活而可扩展的数据存储系统,其将强大的可扩展特性与关系库最有用的特性进行了整合,像:次级索引,范围查询和排序等特性.而MongDB也内建了类似MapReduce汇聚和地 ...
- go安装配置
https://www.cnblogs.com/wt645631686/p/8124626.html Win10下安装Go开发环境 关于Go语言有多么值得学习,这里就不做介绍了,既然看了这篇文章, ...
- Centos7添加磁盘并分区格式化
1.安装前准备 [root@localhost ~]# yum install xfsprogs [root@localhost ~]# modprobe xfs [root@localhost ~] ...
- docker私有仓库操作(搭建、运行、添加、删除)
目录 运行私有仓库 TIPS: 上传 把镜像放入私有仓库 验证 查看 TIPS: 垃圾回收 问题排查 参考:https://yeasy.gitbooks.io/docker_practice/cont ...
- java LinkedHashMap实现LRUCache缓存
package java_map; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map ...
- Godaddy ssl证书配置到nginx
打开终端,输入以下命令 openssl req -new -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr 生成过程会询问几个常见问 ...