转自: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. terminator

    terminator 能够实现linux 终端的分屏显示. 安装 sudo add-apt-repository ppa:gnome-terminator sudoapt-get update sud ...

  2. (原+修改)ubuntu上离线安装pytorch

    转载请注明出处: https://www.cnblogs.com/darkknightzh/p/12000809.html 参考网址: https://blog.csdn.net/qq_4193655 ...

  3. Django框架(四)-- 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别、Django虚拟环境搭建

    路由控制 一.简单路由配置 url(r'^booklist$', views.booklist) 第一个参数是正则表达式,第二个参数是视图函数 每个正则表达式前面的'r' 是可选的但是建议加上.它告诉 ...

  4. Alipay 支付类

    本版本参考网友 <?php namespace App\Tools; class Alipay { //应用ID,您的APPID. private $appID = '111'; //商户私钥 ...

  5. HDU 2612 Find a way 题解

    Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 任务型对话(二)—— DST(对话状态追踪)

    1,概述 关于任务型对话的简介看任务型对话(一)—— NLU(意识识别和槽值填充). 首先我们来看下对话状态和DST的定义. 对话状态:在$t$时刻,结合当前的对话历史和当前的用户输入来给出当前每个s ...

  7. python 解决粘包问题的例子(ftp文件的上传与下载)简单版本

    服务端 ! /user/bin/env python3 -- coding:utf_8 -- """ Author:Markli # 2019/9/9,16:41 &qu ...

  8. vs2008 新建win32控制台程序提示:脚本错误

    解决方案: 1.根据错误信息中的url,找到对应文件夹下的htm文件 2.使用notepad++打开default.htm文件,找到错误提示的434行,注释掉433和434行 然后保存文件,重新新建w ...

  9. Git 游离的HEAD detached HEAD git reflog 查看所有提交的 id

  10. css做的艺术字效果

    Arctext.js 转自  http://tympanus.net/Development/Arctext/