基于Lombok集成springboot遇到的坑
Lombok集成springboot遇到的坑
最近有同事在spring boot中用Lombok @Data注解時(shí)遇到了一個(gè)奇怪的問(wèn)題,然后有幸一起研究了一下,把研究成果記錄下來(lái)。
問(wèn)題
先上代碼:
@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版本可以正常運(yùn)行,但在2.0.3版本卻編譯錯(cuò)誤。
Error:(13, 1) java: TestAbstract() 在 com.brotherj.learn.TestAbstract 中是private 訪問(wèn)控制
查看了pom.xml文件后發(fā)現(xiàn)lombok的版本號(hào)是從spring boot繼承而來(lái):
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
然后又查看了spring boot pom.xml中的lombok版本號(hào),發(fā)現(xiàn)從spring boot 2.0.3版本開(kāi)始使用了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版本號(hào)之后,問(wèn)題解決。
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> <version>1.16.20</version> </dependency>
原因
問(wèn)題解決后,決定研究一下具體的原因,由于Lombok只是依靠可插件化的Java自定義注解處理API(JSR 269: Pluggable Annotation Processing API)來(lái)實(shí)現(xiàn)在Javac編譯階段利用“Annotation Processor”對(duì)自定義的注解進(jìn)行預(yù)處理后生成真正在JVM上面執(zhí)行的“Class文件”。
所以應(yīng)該時(shí)兩個(gè)版本下編譯生成的class文件不同,于是比較了一下兩個(gè)版本下編譯后的class文件。
public TestAbstract(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } //1.16.22會(huì)生成一個(gè)private的構(gòu)造方法,而1.16.20不會(huì)生成 private TestAbstract() { } @Autowired public TestChild(RedisTemplate redisTemplate) { super(redisTemplate); } private TestChild() { }
看到這里一切就都清楚了,是類(lèi)加載順序?qū)е碌膯?wèn)題。
先復(fù)習(xí)一下類(lèi)加載順序:(靜態(tài)變量、靜態(tài)初始化塊)–>(變量、初始化塊)–> 構(gòu)造器。如果有父類(lèi),加載順序是:父類(lèi)static方法 –> 子類(lèi)static方法 –> 父類(lèi)構(gòu)造方法- -> 子類(lèi)構(gòu)造方法 。
也就是說(shuō),當(dāng)加載TestChild類(lèi)時(shí)先加載類(lèi)TestAbstract的構(gòu)造方法,而類(lèi)TestAbstract的空參構(gòu)造為private,于是報(bào)了訪問(wèn)控制的錯(cuò)誤。
springboot引入Lombok
傳統(tǒng)的寫(xiě)法,要寫(xiě)一串串的get()、set()方法等等
現(xiàn)引入Lombok
pom.xml引入
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
引入后發(fā)現(xiàn),在實(shí)體類(lèi)上面使用@Data找不到import的包
網(wǎng)上巴拉巴拉,發(fā)現(xiàn)是springBoot的版本和import的版本不統(tǒng)一,加上
<optional>true</optional>
提示版本信息,改為可用的版本即可。修正后如下:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> <version>1.18.2</version> </dependency>
終于可以正常導(dǎo)入^_^
延伸閱讀(1):
idea安裝Lombok插件
File——Settings——Plugins——Marketplact
延伸閱讀(2):
常見(jiàn)參數(shù)
@Setter
注解在類(lèi)或字段,注解在類(lèi)時(shí)為所有字段生成setter方法,注解在字段上時(shí)只為該字段生成setter方法。@Getter
使用方法同上,區(qū)別在于生成的是getter方法。@ToString
注解在類(lèi),添加toString方法。@EqualsAndHashCode
注解在類(lèi),生成hashCode和equals方法。@NoArgsConstructor
注解在類(lèi),生成無(wú)參的構(gòu)造方法。@RequiredArgsConstructor
注解在類(lèi),為類(lèi)中需要特殊處理的字段生成構(gòu)造方法,比如final和被@NonNull注解的字段。@AllArgsConstructor
注解在類(lèi),生成包含類(lèi)中所有字段的構(gòu)造方法。@Data
注解在類(lèi),為類(lèi)的所有字段注解@ToString、@EqualsAndHashCode、@Getter的便捷方法,同時(shí)為所有非final字段注解@Setter。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)九宮格的簡(jiǎn)單實(shí)例
這篇文章主要介紹了 Java實(shí)現(xiàn)九宮格的簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06教你用java?stream對(duì)集合中的對(duì)象按指定字段進(jìn)行分組并統(tǒng)計(jì)
這篇文章主要給大家介紹了關(guān)于用java?stream對(duì)集合中的對(duì)象按指定字段進(jìn)行分組并統(tǒng)計(jì)的相關(guān)資料,本文主要介紹了如何利用Java的Stream流來(lái)實(shí)現(xiàn)在list集合中,對(duì)具有相同name屬性的對(duì)象進(jìn)行匯總計(jì)算的需求,需要的朋友可以參考下2024-10-10Java利用遞歸實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的工具類(lèi)
有時(shí)候,我們的數(shù)據(jù)是帶有層級(jí)的,比如常見(jiàn)的省市區(qū)三級(jí)聯(lián)動(dòng),就是一層套著一層。而我們?cè)跀?shù)據(jù)庫(kù)存放數(shù)據(jù)的時(shí)候,往往是列表形式的,這個(gè)時(shí)候可能就需要遞歸處理為樹(shù)形結(jié)構(gòu)了。本文就為大家介紹了Java利用遞歸實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的工具類(lèi),希望對(duì)大家有所幫助2023-03-03javaweb實(shí)戰(zhàn)之商城項(xiàng)目開(kāi)發(fā)(三)
這篇文章主要針對(duì)javaweb商城項(xiàng)目開(kāi)發(fā)進(jìn)行實(shí)戰(zhàn)演習(xí),主要實(shí)現(xiàn)通用的BaseDao.java和使用resultMap映射關(guān)聯(lián)對(duì)象,感興趣的小伙伴們可以參考一下2016-02-02SpringBoot之@Value獲取application.properties配置無(wú)效的解決
這篇文章主要介紹了SpringBoot之@Value獲取application.properties配置無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03