mapstruct之类型转换
bigdecimal转换为integer参考链接:
背景介绍
是不是有时候发现明明source和target不是同⼀个类型,但是却转换成功了,这是因为mapstruct有⼀套⾃⼰的类型转换机制类型转换的流程
1. ⾸先尝试⾃动进⾏类型转换
2. 若是⽆法⽀持的类型转换,则是尝试调⽤已经存在的类型转换⽅法
3. 不存在可⽤的⽅法则是尝试⾃⼰创建⼀个类型转换⽅法
类型转换分类
⾃动转换
以下的类型之间是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;
Long skuPrice;
List<String> nameList;
Item2 item;
}
@Mapper
public interface ItemConvert {
ItemConvert INSTANCE = Mapper(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( SkuId());
skuDTO2.setSkuCode( SkuCode());
if( SkuPrice()!= null ){
skuDTO2.setSkuPrice( Long.parseLong( SkuPrice()));
}
List<String> list = NameList();
if( list != null ){
skuDTO2.setNameList(new ArrayList<String>( list ));
}
skuDTO2.setItem(item1ToItem2( Item()));
return skuDTO2;
}
protected Item2 item1ToItem2(Item1 item1){
if( item1 == null ){
return null;
}
Item2 item2 =new Item2();
item2.setItemId( ItemId());
item2.setTitle( Title());
return item2;
}
⾃定义转换类型
使⽤表达式进⾏定义类型转换,expression="java(。。。)"
注意:使⽤表达式的时候,类必须是全路径的使⽤,或者@Mapper(imports={类名.class}
@Mapper(imports={DemandSourceEnum.class})
public interface CarDealMapper {
CarDealMapper INSTANCE = Mapper(CarDealMapper.class);
@Mappings({
@Mapping(target ="demandSource", expression ="DemandSource()))"),    SaleDemandVO doToVo(CarDealDO carDealDO);
}
⾃定义⽅法进⾏类型转换
@Mapper
public interface ItemConvert {
ItemConvert INSTANCE = Mapper(ItemConvert.class);
SkuDTO2 domain2Dto(Sku2 sku2);
default Item2 item1ToItem2(Item1 item1){
if(item1 == null){
return null;
}
Item2 item2 =new Item2();
item2.setItemId(11111L);
item2.Title());
return item2;
}
}
// mapstruct 的实现类
@Generated(
value ="org.mapstruct.ap.MappingProcessor",
date ="2019-07-30T18:38:11+0800",
comments ="version: 1.3.0.Final, compiler: javac, environment: Java 1.8.0_101 (Oracle Corporation)"
)
public class ItemConvertImpl implements ItemConvert {
@Override
public SkuDTO2 domain2Dto(Sku2 sku2){
if( sku2 == null ){
return null;
}
SkuDTO2 skuDTO2 =new SkuDTO2();
skuDTO2.setSkuId( SkuId());
skuDTO2.setSkuCode( SkuCode());
if( SkuPrice()!= null ){
skuDTO2.setSkuPrice( Long.parseLong( SkuPrice()));
}
List<String> list = NameList();
if( list != null ){
skuDTO2.setNameList(new ArrayList<String>( list ));
}
// mapstruct直接调⽤的是在接⼝中⾃定义的实现
skuDTO2.setItem(item1ToItem2( Item()));
return skuDTO2;
}
}
使⽤策略的⽅式进⾏类型转换
若是类型在很多Mapper中都需要使⽤,⽐较使⽤下例
public class BooleanStrategy {
public String booleanToString(Boolean value){
if(value == null){
return"--";
}
return value ?"是":"否";
}
public Integer booleanToInteger(Boolean value){
if(value == null){
return null;
}
return value ?1:0;
}
public Boolean IntegerToBoolean(Integer value){
if(value == null){
return null;
}
return value ==0?false:true;
}
public String dateFormate(Date date){
if(date == null){
return"--";
}
return DateFormatUtils.format(date,"yyyy-MM-dd HH:mm:ss");
}
}
@Mapper(uses = BooleanStrategy.class)
public interface CarDealMapper {
CarDealMapper INSTANCE = Mapper(CarDealMapper.class);
CarDealDO dtoToDo(PlateCityMessageDTO plateCityMessageDTO);
}
⽅法中target和source 类型满⾜ BooleanStrategy⽅法的,会⾃动进⾏调⽤这个⽅法的类型转换进⾏处理⾃定义常量的⽅法
若是我们需要给⼀些属性定义⼀个固定的值,这个时候可以使⽤ constant
@Mapping(target ="whetherPass", constant ="true")
CentralizedNewCarShipDTO doToDubboDto(CarDealDO carDealDO);
特殊类型的转换
@Mapping(target ="createTime", dateFormat ="yyyy-MM-dd HH:mm:ss", expression ="java(new Date())")
CarDTO doToDTO(CarDO carDO);
另外还有numberFormat定义数字的格式转换
⾃定义初始值 defaultValue
当source值为空的时候则会使⽤defaultValue定义的值。⽽constant则是⽆论source是否为空,都会使⽤constant定义的值,注意区分两者
/**
* 单个参数的直接使⽤
*
* @param carDO source do
* @return target dto
*/
@Mapping(target ="userName", constant ="yby")
@Mapping(target ="modelColor", source ="modelColor", defaultValue ="标致")
@Mapping(target ="createTime", dateFormat ="yyyy-MM-dd HH:mm:ss", expression ="java(new Date())")
CarDTO doToDTO(CarDO carDO);
额外的请参考 org.mapstruct.Mapping
Collection转换
原理是遍历source collection然后转换类型,put到target collection中 如果是可以⾃动转换的则⾃动转换,同date type conversion;若是⽆法⾃动转换的,则会查看是否有可以调⽤的类型
@Mapper(imports = Date.class)
public interface CarMapper {
CarMapper INSTANCE = Mapper(CarMapper.class);
/**
* 基本类型collection的转换
*
* @param integers
* @return
*/
Set<String>integerSetToStringSet(Set<Integer> integers);
/**
* 调⽤存在已有⽅法的转换
*
* @param cars
* @return
*/
List<CarDTO>carsToCarDtos(List<CarDO> cars);
/**
* 单个参数的直接使⽤
*
* @param carDO source do
* @return target dto
*/
@Mapping(target ="userName", constant ="yby")
@Mapping(target ="modelColor", source ="modelColor", defaultValue ="标致")
@Mapping(target ="createTime", dateFormat ="yyyy-MM-dd HH:mm:ss", expression ="java(new Date())")
CarDTO doToDTO(CarDO carDO);
/**
* DTO转为VO
*
* @param warehouseValidDTOList
* @return
*/
List<WarehouseValidPageVO>dtoToVo(List<WarehouseValidDTO> warehouseValidDTOList);
}
// mapstruct实现
@Generated(