mapstruct 之 类型转换

本文介绍了MapStruct在处理类型转换时的机制,包括背景、流程和各类转换方式。MapStruct会自动进行基本类型及包装类型之间的转换,以及基本类型与String间的转换。对于自定义转换,可以通过表达式、自定义方法或策略方式进行。此外,还详细讲解了Collection和Map的转换,以及如何设置默认值和自定义常量。
摘要由CSDN通过智能技术生成

参考链接:mapstruct的基本使用

背景介绍

是不是有时候发现明明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;
    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值