参考链接:mapstruct的基本使用
背景介绍
是不是有时候发现明明source和target不是同一个类型,但是却转换成功了,这是因为mapstruct有一套自己的类型转换机制
类型转换的流程
- 首先尝试自动进行类型转换
- 若是无法支持的类型转换,则是尝试调用已经存在的类型转换方法
- 不存在可用的方法则是尝试自己创建一个类型转换方法
类型转换分类
自动转换
以下的类型之间是mapstruct自动进行类型转换的。
- 基本类型及其他们对应的包装类型。
此时mapstruct会自动进行拆装箱。不需要人为的处理 - 基本类型的包装类型和string类型之间
@Data
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@AllArgsConstructor
public class Item1 {
Long itemId;
String title;
}
@Data
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@AllArgsConstructor
public class Item2 {
Long itemId;
String title;
}
@Data
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@AllArgsConstructor
public class Sku2 {
Long skuId;
String skuCode;
String skuPrice;
List<String> nameList;
Item1 item;
}
@Data
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@AllArgsConstructor
public class SkuDTO2 {
Long skuId;
String skuCode;
Long skuPrice;
List<String> nameList;
Item2 item;
}
@Mapper
public interface ItemConvert {
ItemConvert INSTANCE = Mappers.getMapper(ItemConvert.class);
SkuDTO2 domain2Dto(Sku2 sku2);
}
// 以下为mapstruct自动生成
public class ItemConvertImpl implements ItemConvert {
@Override
public SkuDTO2 domain2Dto(Sku2 sku2) {
if ( sku2 == null ) {
return null;
}
SkuDTO2 skuDTO2 = new SkuDTO2();
skuDTO2.setSkuId( sku2.getSkuId() );
skuDTO2.setSkuCode( sku2.getSkuCode() );
if ( sku2.getSkuPrice() != null ) {
skuDTO2.setSkuPrice( Long.parseLong( sku2.getSkuPrice() ) );
}
List<String> list = sku2.getNameList();
if ( list != null ) {
skuDTO2.setNameList( new ArrayList<String>( list ) );
}
skuDTO2.setItem( item1ToItem2( sku2.getItem() ) );
return skuDTO2;
}
protected Item2 item1ToItem2(Item1 item1) {
if ( item1 == null ) {
return null;
}
Item2 item2 = new Item2();
item2.setItemId( item1.getItemId() );
item2.setTitle( item1.getTitle() );
return item2;
}
自定义转换类型
- 使用表达式进行定义类型转换,
expression="java(。。。)"
注意:使用表达式的时候,类必须是全路径的使用,或者@Mapper(imports={类名.class}
@Mapper(imports={
DemandSourceEnum