基于Lombok集成springboot遇到的坑

目录
  • Lombok集成springboot遇到的坑
    • 问题
    • 原因
  • springboot引入Lombok

Lombok集成springboot遇到的坑

最近有同事在spring boot中用Lombok @Data注解时遇到了一个奇怪的问题,然后有幸一起研究了一下,把研究成果记录下来。

问题

先上代码:

@Data
public abstract class TestAbstract {
    private RedisTemplate redisTemplate;
    public TestAbstract(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
}
@Data
public class TestChild extends TestAbstract {
    @Autowired
    public TestChild(RedisTemplate redisTemplate) {
        super(redisTemplate);
    }
}

上面的代码在spring boot 2.0.2版本可以正常运行,但在2.0.3版本却编译错误。

Error:(13, 1) java: TestAbstract() 在 com.brotherj.learn.TestAbstract 中是private 访问控制

查看了pom.xml文件后发现lombok的版本号是从spring boot继承而来:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

然后又查看了spring boot pom.xml中的lombok版本号,发现从spring boot 2.0.3版本开始使用了lombok 1.16.22,而2.0.2版本使用的是1.16.20版本。

#2.0.2
<lombok.version>1.16.20</lombok.version>

#2.0.3
<lombok.version>1.16.22</lombok.version>

于是修改pom.xml版本号之后,问题解决。

 <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
    <version>1.16.20</version>
</dependency>

原因

问题解决后,决定研究一下具体的原因,由于Lombok只是依靠可插件化的Java自定义注解处理API(JSR 269: Pluggable Annotation Processing API)来实现在Javac编译阶段利用“Annotation Processor”对自定义的注解进行预处理后生成真正在JVM上面执行的“Class文件”。

所以应该时两个版本下编译生成的class文件不同,于是比较了一下两个版本下编译后的class文件。

    public TestAbstract(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    //1.16.22会生成一个private的构造方法,而1.16.20不会生成
    private TestAbstract() {
    }

     @Autowired
    public TestChild(RedisTemplate redisTemplate) {
        super(redisTemplate);
    }
    private TestChild() {
    }

看到这里一切就都清楚了,是类加载顺序导致的问题。

先复习一下类加载顺序:(静态变量、静态初始化块)–>(变量、初始化块)–> 构造器。如果有父类,加载顺序是:父类static方法 –> 子类static方法 –> 父类构造方法- -> 子类构造方法 。

也就是说,当加载TestChild类时先加载类TestAbstract的构造方法,而类TestAbstract的空参构造为private,于是报了访问控制的错误。

springboot引入Lombok

传统的写法,要写一串串的get()、set()方法等等

现引入Lombok

pom.xml引入

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

引入后发现,在实体类上面使用@Data找不到import的包

网上巴拉巴拉,发现是springBoot的版本和import的版本不统一,加上

<optional>true</optional>

提示版本信息,改为可用的版本即可。修正后如下:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
    <version>1.18.2</version>
</dependency>

终于可以正常导入^_^

延伸阅读(1):

idea安装Lombok插件

File——Settings——Plugins——Marketplact

延伸阅读(2):

常见参数

  • @Setter 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
  • @Getter 使用方法同上,区别在于生成的是getter方法。
  • @ToString 注解在类,添加toString方法。
  • @EqualsAndHashCode 注解在类,生成hashCode和equals方法。
  • @NoArgsConstructor 注解在类,生成无参的构造方法。
  • @RequiredArgsConstructor 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
  • @AllArgsConstructor 注解在类,生成包含类中所有字段的构造方法。
  • @Data 注解在类,为类的所有字段注解@ToString、@EqualsAndHashCode、@Getter的便捷方法,同时为所有非final字段注解@Setter。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot工程下Lombok的应用教程详解

    背景分析 在实际的java项目中我们创建的所有pojo类几乎都要为属性添加set/get/toString等相关方法,所有的日志记录相关类可能都要创建日志等对象,这些样板代码既没有技术含量,又影响着代码的美观,同时重复的编码过程会在无形中加大我们的工作量. 此时Lombok应运而生. lombok简介 概述 Lombok是一个第三方的Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来告诉编译过程中的编译工具,在源代码编译成字节码的过程中,在字节码中添加一些量样板代

  • 在SpringBoot中使用lombok的注意事项

    目录 Lombok需求 Lombok的使用 开发工具无论是idea还是eclipse都必须要安装插件 在项目中依赖Lombok如下 简化javabean 证明lombok在编译以后会自动生成 Lombok其他的注解 lombok插件使用和lombok不起作用的解决 @Data不起作用解决法方法 Lombok需求 在传统的开发过程中,一个javabean开发非常琐碎和麻烦,如下: package com.example.entity; public class User { // 用户编号 pri

  • idea 在springboot中使用lombok插件的方法

    在idea中添加lombok插件 选择 file-->setting--->plugins  搜索lombok  并安装插件后重启idea 使用Lombok 在pom.xml中引入依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <s

  • Springboot中使用lombok的@Data注解方式

    目录 Springboot 使用lombok的@Data注解 idea安装lombok插件 创建项目,编写实体类 编写测试类 测试结果 springBoot 注解@Data注入失败 一.Files--Seetings--Plugins 二.如果重启后仍注入失败 Springboot 使用lombok的@Data注解 idea安装lombok插件 点击setting,选择plugins,搜索lombok安装即可. 创建项目,编写实体类 安装好插件后需要重启idea,然后创建一个springboot

  • Lombok为啥这么牛逼?SpringBoot和IDEA官方都要支持它

    最近 IDEA 2020最后一个版本发布了 ,已经内置了Lombok插件,SpringBoot 2.1.x之后的版本也在Starter中内置了Lombok依赖.为什么他们都要支持Lombok呢?今天我来讲讲Lombok的使用,看看它有何神奇之处! Lombok简介 Lombok是一款Java代码功能增强库,在Github上已有9.8k+Star.它会自动集成到你的编辑器和构建工具中,从而使你的Java代码更加生动有趣.通过Lombok的注解,你可以不用再写getter.setter.equals

  • SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

    导读 Lombok:可以让你的POJO代码特别简洁,不止简单在BO/VO/DTO/DO等大量使用,还有设计模式,对象对比等 MybatisPlus:增加版Mybatis,基础的数据库CRUD.分页等可以直接生成使用,避免了大量的重复低效代码,还有数据库自动Java类,sql文件等等,比传统的更贱简介易用 SwaggerUI:接口文档自动生成,对接前端和测试更加方便,基于业界的OpennApi规范,采用Swagger3.x版本. 技术栈 SpringBoot2.4+ MybatisPlus+Lom

  • 基于Lombok集成springboot遇到的坑

    目录 Lombok集成springboot遇到的坑 问题 原因 springboot引入Lombok Lombok集成springboot遇到的坑 最近有同事在spring boot中用Lombok @Data注解时遇到了一个奇怪的问题,然后有幸一起研究了一下,把研究成果记录下来. 问题 先上代码: @Data public abstract class TestAbstract { private RedisTemplate redisTemplate; public TestAbstract

  • 使用kotlin集成springboot开发的超详细教程

    目录 一.安装支持插件 二.maven配置 注意 三.创建入口函数类 四.编写入口函数 五.创建数据库对象 六.创建仓库操作接口 七.创建一个业务接口来声明业务 八.创建一个业务接口实现来实现声明的业务 九.创建一个 http服务接口 目前大多数都在使用java集成 springboot进行开发,本文演示仅仅将 java换成 kotlin,其他不变的情况下进行开发. 一.安装支持插件 在 idea中安装 kotlin插件(大多数情况下会默认安装了) 二.maven配置 注意 kotlin目前不支

  • 详解基于JWT的springboot权限验证技术实现

    JWT简介 Json Web Token(JWT):JSON网络令牌,是为了在网络应用环境间传递声明而制定的一种基于JSON的开放标准((RFC 7519).JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式用于通信双方之间以 JSON 对象行使安全的传递信息.因为数字签名的存在,这些信息是可信的. 实现步骤: 环境spring boot 1.添加jwt依赖 <dependency> <groupId>com.auth0</groupId> <ar

  • jasypt 集成SpringBoot 数据库密码加密操作

    昨天看到一片文章,说是某某旗下酒店数据库因为程序员不小心,把数据库明文密码上传到了GitHub上,导致酒店数据注册资料.入住信息,开房记录被下载倒卖的消息. 作为程序员,开发的时候为了简单,账户明明都设置很简单,基本上数据库密码都是明文的,没做什么操作,至少我待过的公司都是这样,无论是测试环境还是线上环境,想想,这个也是一大安全隐患,在此,趁现在不忙,做些基于springboot的数据库密码加密. 1.pom.xml添加jar包(不同jdk选择不同的版本): <!-- jdk8 版本 整合jas

  • 基于logback 实现springboot超级详细的日志配置

    前言 java web 下有好几种日志框架,比如:logback,log4j,log4j2(slj4f 并不是一种日志框架,它相当于定义了规范,实现了这个规范的日志框架就能够用 slj4f 调用).其中性能最高的应该使 logback 了,而且 springboot 默认使用的也是 logback 日志,所以本篇将会详细的讲解 logback 的日志配置方案. 本篇主要内容如下: •logback 配置文件的构成 •如何将日志输出到文件 •如何按时间,按大小切分日志 •如何将让一个日志文件中只有

  • 基于MockMvc进行springboot调试(SpringbootTest)

    这篇文章主要介绍了基于MockMvc进行springboot调试(SpringbootTest),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 测试前关闭web项目.springboot启动程序WebApplication.class 笔者本地自定了端口SpringBootTest.WebEnvironment.DEFINED_PORT 代码如下: import com.netmarch.web.WebApplication; import o

  • 基于Jasypt对SpringBoot配置文件加密

    这篇文章主要介绍了基于Jasypt对SpringBoot配置文件加密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 引入jasypt <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.0.0<

  • 基于idea把springboot项目部署到docker

    这篇文章主要介绍了基于idea把springboot项目部署到docker,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.idea安装docker插件 1.安装 2.配置 备注:要使docker可以通过2375端口访问,需要配置docker vim /lib/systemd/system/docker.service 修改如下 3.配置容器 Dockerfile文件(此处为了方便,将Dockerfile文件放到根目录下面) FROM jav

  • 基于注解实现 SpringBoot 接口防刷的方法

    该示例项目通过自定义注解,实现接口访问次数控制,从而实现接口防刷功能,项目结构如下: 一.编写注解类 AccessLimit package cn.mygweb.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targ

  • 基于注解的springboot+mybatis的多数据源组件的实现代码

    通常业务开发中,我们会使用到多个数据源,比如,部分数据存在mysql实例中,部分数据是在oracle数据库中,那这时候,项目基于springboot和mybatis,其实只需要配置两个数据源即可,只需要按照 dataSource -SqlSessionFactory - SqlSessionTemplate配置好就可以了. 如下代码,首先我们配置一个主数据源,通过@Primary注解标识为一个默认数据源,通过配置文件中的spring.datasource作为数据源配置,生成SqlSessionF

随机推荐