1 問題:
使用lombok,DDD設計思想整合mapStruct時,轉Entity 生成的ToDominObject沒有用有參構造方法構造對象
2 解決方案:
2.1 未解決_原因猜想
因爲生成的實現類,ToPo有對應的Set方法,ToEntity沒有對應的Set方法。
Po中有@Setter註解,而Do爲了維護對象完整性,不會有set方法(參見:https://www.cnblogs.com/1446358788-qq/articles/15319451.html 1.2.3).所以導致轉Do的方法沒有set方法。而項目對應的生成的實現類的toEntity中是用有參構造生成的對象,所以這是我們的目標。
2.2 未解決_正確步驟_大佬1支持_添加@Default註解
請教了一個同事,發現和項目對比,Do的有參構造方法
缺少了@Default註解,於是添加了該註解,並新增了該註解類。
package com.example.jiayou.ceshi; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.CONSTRUCTOR})//註解的作用目標:構造函數 @Retention(RetentionPolicy.RUNTIME)//註解不僅被保存到class文件中,jvm加載class文件之後,仍然存在 public @interface Default { }
初步推測,mapStruct是在jvm加載的時候生成的實現類,默認用有參構造函數,然而,啓動後發現依然不行,至少往前邁進了一步
2.3 未解決_正確步驟_大佬2支持_lombok版本問題
於是請教了原先做這塊的同事,這塊同事說是lombok版本問題,只有1.4+版本的才支持這種做法,於是pom文件放入項目在用的1.4.2.Final版本,啓動後飄紅
2.4 已解決_lombok版本問題
原先受網上一些說法jdk8以下的mapstruct-jdk8的蠱惑,導致報錯,修改成
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.4.2.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency>
問題解決.
3 問題反思
以前很多問題卡殼,是因爲沒有或者不清楚正確的做法,以後整理知識點的時候還是要拿已經有成功的案例的,這樣有相關的資源可以利用,試錯成本就會少很多
4 整合後的整個案例
https://www.cnblogs.com/1446358788-qq/articles/16585575.html 2