首頁 > 遊戲
MapStruct的使用,java實體類的轉換
由 理財的程式設計師 發表于 遊戲2023-01-28
簡介”符號處理巢狀對映(在原始碼中):示例11:具有多個源引數的對映方法@Mappings({@Mapping(target = “chartName”, source = “chart
java中的實體類怎麼寫
我們在開發的過程中對於領域進行了分層,像是VO/DTO/BO/DAO等,這樣分層的好處是看到實體物件的名稱就可以知道實體類對應的功能,但是同時也給開發帶來了不便,就是各種物件的轉換,如果一個物件有幾個欄位,我們直接呼叫get set方法即可,如果要是有十幾個欄位或者更多呢?可能還會涉及到型別的轉換,如果這樣就會導致滿螢幕的get set方法,不僅感覺很low,而且不符合軟體的精神——不要重複造輪子。下面給大家推薦一款比較好用的外掛,他可以用來完成實體類之間的轉換工作,並且可以自定義轉換方法-MapStruct。
準備工作:
Maven配置,需要我們在pom檔案中新增以下引用
需要注意的是如果專案中使用了swagger,需要放到swagger的上面,不然執行會出錯
普通用法:
@Mapper(componentModel = “spring”)// 方便透過註解的方式使用
public interface AccessToOpenApiInfoMapper {
/** 對映器的例項,可以透過這個呼叫相應的方法,這個可以不用要,是執行緒安全的可以安心使用
*呼叫的例子程式碼:
*OpenApiInfo openApiInfo = AccessToOpenApiInfoMapper 。INSTANCE。from( access );
*/
AccessToOpenApiInfoMapper INSTANCE = Mappers。getMapper(AccessToOpenApiInfoMapper。class);
@Mappings({
@Mapping(source = “value”, target = “apiCode”),
@Mapping(source = “label”, target = “apiName”)
})
OpenApiInfo from(Access access);
List
//反向生成
@InheritInverseConfiguration
Access fromBack(OpenApiInfo serviceNoApiCodeXref);
@InheritInverseConfiguration
List
}
進階用法:
多個源引數的對映方法
MapStruct還支援具有多個源引數的對映方法。這很有用,例如為了將多個實體組合成一個數據傳輸物件。以下是一個示例:
示例:多個源引數的對映方法
@MapperpublicinterfaceAddressMapper{
@Mappings({
@Mapping(source = “person。description”, target = “description”),
@Mapping(source = “address。houseNo”, target = “houseNumber”)
})
DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Address address);}
上例所示的對映方法採用兩個源引數並返回組合的目標物件。與單引數對映方法一樣,屬性按名稱對映。
如果多個源物件定義具有相同名稱的屬性,則必須使用@Mapping註解指定從中檢索屬性的source引數,如示例中的description屬性所示。如果不解決這種歧義,將會引發錯誤。對於在給定源物件中僅存在一次的屬性,可以選擇指定源引數的名稱,因為它可以自動確定。
使用@Mapping註解時,必須指定屬性所在的引數。
如果所有源引數都為null,則具有多個源引數的對映方法將返回null。否則,將例項化目標物件,並且將傳遞所提供引數的所有屬性。
巢狀對映
MapStruct將透過“。”符號處理巢狀對映(在原始碼中):
示例11:具有多個源引數的對映方法
@Mappings({
@Mapping(target = “chartName”, source = “chart。name”),
@Mapping(target = “title”, source = “song。title”),
@Mapping(target = “artistName”, source = “song。artist。name”),
@Mapping(target = “recordedAt”, source = “song。artist。label。studio。name”),
@Mapping(target = “city”, source = “song。artist。label。studio。city”),
@Mapping(target = “position”, source = “position”)
})
ChartEntry map(Chart chart, Song song, Integer position);
MapStruct將對源中的每個巢狀屬性執行空檢查。
也可以以這種方式對映非java bean源引數(如java。lang。Integer)。
實體屬性轉換
@Mapping(source = “endTime”, target = “endTime”, dateFormat = “yyyy-MM-dd HH:mm:ss”),
@Mapping 中的ignore 賦值 true可以忽略某個欄位(這個主要是在欄位相同,但是型別不同,並且不能裝換的時候用)
問題:如果多個list這個default是怎麼做到的?可以看下原始碼
@Mapping(source = “pm25”, target = “pm25”, qualifiedByName = “formatDoubleDef”)
AreaVO areaPO2areaVO(AreaPO areaPO);
@Named(“formatDoubleDef”)//需要起個名字,不然報錯,可以與方法名一致,當然也可以不一致
default Double formatDouble(Double source) {
DecimalFormat decimalFormat = new DecimalFormat(“0。00”);//小數位格式化
if (source == null) {
source = 0。0; }
return Double。parseDouble(decimalFormat。format(source));
}
多個類轉換的時候要把預設方法寫後面
CustomerRVO form(User user, EnterpriseIdentity enterpriseIdentity);
default UserTypeEnum stringToEnum(String s) {
switch (s) {
case “PAAS_CLIENT”:
return UserTypeEnum。PlatformUser;
default:
return null;
}}