转自: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一起用无法添加无参构造方法的坑的更多相关文章

  1. java~lombok里的Builder注解

    lombok注解在java进行编译时进行代码的构建,对于java对象的创建工作它可以更优雅,不需要写多余的重复的代码,这对于JAVA开发人员是很重要的,在出现lombok之后,对象的创建工作更提供Bu ...

  2. lombok 下的@Builder注解用法

    pom依赖 <dependency> <groupId>org.projectlombok</groupId>            <artifactId& ...

  3. 详解Lombok中的@Builder用法

    Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 基础使用 @Builder注释为你的类生成相对略微复杂 ...

  4. Lombok中的@Builder注解

    1.前言 今天在看项目代码的时候, 遇到了实体类上加@Builder注解, 之前在开发的时候, 一直没有用过这个注解, 便兴致勃勃地去查了一下资料, 它也是Lombok中的注解, 我们都知道Lombo ...

  5. 在项目中导入lombok依赖自动生成有参,无参 空参 方法的注解

    导入依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok< ...

  6. 使用lombok.Data编译时无法找到get/set方法

    我的IDEA版本是2019.2 在使用IDEA创建了一个SpringBoot项目,其中一个实体类使用了@Data注解,但是在Service中调用的时候找不到get/set方法. 检查步骤: 1.在St ...

  7. 记: Spring Data Jpa @OneToMany 级联查询被动触发的问题

    I have encountered a bug in using Spring Data Jpa. Specifically,when @OneToMany was used to maintain ...

  8. .net core 开车记:Data Protection Key 过期问题与登录页面访问慢

    K8s 船还没修好,.net core 车又出了问题,开着 k8s 豪华邮轮.飚着 .net core 极品飞车的好事真是多磨. 自从我们用上 .net core ,就一直被 .net core 的一 ...

  9. djangorestframework+vue-cli+axios,为axios添加token作为headers踩坑记

    情况是这样的,项目用的restful规范,后端用的django+djangorestframework,前端用的vue-cli框架+webpack,前端与后端交互用的axios,然后再用户登录之后,a ...

随机推荐

  1. 7.vertical-align属性

    本节学习目标: 图片.表单和旁边的文字对齐 解决图片底部默认空白缝隙问题 1.图片.表单和旁边的文字对齐 默认的图片.表单等行内元素或行内快元素是和文字的基线对齐的,但在实际情况下,我们想让他们中间对 ...

  2. 隐马尔科夫模型(Hidden Markov Models) 系列之一

    转自:http://blog.csdn.net/eaglex/article/details/6376826 介绍(introduction) 通常我们总是对寻找某一段时间上的模式感兴趣,这些模式可能 ...

  3. Objective-C的self.用法

    转自:http://mobile.51cto.com/iphone-313096.htm 进入正题, 我们经常会在官方文档里看到这样的代码: MyClass.h @interface MyClass ...

  4. android studio学习----Failed to resolve: com.android.support:design:22.1.1

    这个目前好像没有合适的办法,唯一可行的就是 点击那个提示  进行SDK Manager下载就可以了 但是天朝的网啊,我试了很多次,突然的可以下载,运气啊 类似这一系列问题解决办法就是  重新更新SDK ...

  5. SpringBoot+logback实现按业务输出日志到不同的文件

        公司有个项目,需要和几个第三方系统对接.这种项目,日志一定要记录详细,不然出了问题就是各种甩锅.虽然项目里面和第三方系统对接相关的业务记录的日志很详细,但是由于整个项目的日志都在一个文件中,排 ...

  6. 服务刚启动就 Old GC,要闹哪样?

    1.背景 最近有个同学说他的服务刚启动就收到两次 Full GC 告警, 按道理来说刚启动,对象应该不会太多,为啥会触发 Full GC 呢? 带着疑问,我们还是先看看日志吧,毕竟日志的信息更多. 2 ...

  7. 01篇ELK日志系统——升级版集群之elasticsearch集群的搭建

    [ 前言:以前搭了个简单的ELK日志系统,以我个人的感觉来说,ELK日志系统还是非常好用的.以前没有弄这个ELK日志系统的时候,线上的项目出了bug,报错了,要定位错误是什么,错误出现在哪个java代 ...

  8. centos7放行1521端口

    [root@localhost ~]# firewall-cmd --zone=public --add-port=1521/tcp --permanent success [root@localho ...

  9. 『Python进阶』多进程多线程快速上手

    线程池快速上手 from concurrent.futures import ThreadPoolExecutor from utils import * workers = 8 with Threa ...

  10. 1 NLP学习大纲

    一.自然语言处理概述 1)自然语言处理:利用计算机为工具,对书面实行或者口头形式进行各种各样的处理和加工的技术,是研究人与人交际中以及人与计算机交际中的演员问题的一门学科,是人工智能的主要内容. 2) ...