MapStruct使用示例集合

一般都是定义一个映射的接口类,并在类上标记注解@Mapper 。定义抽象类也可以。这里先说接口类

在类中定义一个单例的实例对象INSTANCE
XxxMapper INSTANCE = Mappers.getMapper(XxxMapper.class);
就可以使用了

public interface XxxMapper {

    XxxMapper INSTANCE = Mappers.getMapper(XxxMapper.class);

    @Mappings({
            //不同名字段映射
            @Mapping(source = "ad.id", target = "thirdPartyAdId"),
            //将传入的参数变量设置为目标字段的值(跟上面的不同名映射不一样)
            @Mapping(source = "positionType", target = "posType"),
            //将源对象里面拓展字段(对象里的对象)设置在目标对象首层里对应的属性中(扁平化)
            @Mapping(source = "extMap", target = "."),
            //忽略某个对象下某个字段
            @Mapping(target = "appInfo.appTags", ignore = true),
            //通过表达式对目标字段使用固定枚举值,需要在@Mapper注解中使用imports导入该枚举类
            @Mapping(target = "dsp", expression = "java(DspTypeEnum.TENCENT.getValue())"),
            //也可以通过表达式赋予当前时间
            @Mapping(target = "createTime", expression = "java(new java.util.Date())"),
            //当源字段为空时,目标字段使用默认值
            @Mapping(source = "from", target = "from", defaultValue = "mixer"),
            //目标字段直接写死固定值的情况
            @Mapping(target = "platformType", constant = "normal"),
            //需要逻辑处理的字段,使用qualifiedByName指定处理方法,就在本类中定义处理方法并用@Named注解
            @Mapping(source = "ad.ecpmE3", target = "ecpm", qualifiedByName = "ecpmE3ToEcpm"),
            //自定义方法需传入多个参数时,使用表达式传入即可
            @Mapping(target = "expireSeconds", expression = "java(XxxMapper.INSTANCE.expireSecondsConvertor(ad.getEndTime(), defaultExpireSeconds))"),
    })
    Ad toAd(com.tencent.platform.ad.mixer.protocol.entity.Ad tencentAd, int positionType, Long defaultExpireSeconds);

    @Named("styleCodeConverter")
    default int styleCodeConverter(int positionType){
        if (positionType == PositionTypeEnum.DISTRIBUTE.getValue()) {
            //应用样式广告
            return StyleCodeEnum.APPLICATION.getValue();
        }
        //默认为H5样式
        return StyleCodeEnum.H5.getValue();
    }

    @Named("ecpmE3ToEcpm")
    default BigDecimal ecpmE3ToEcpm(Long ecpmE3) {
        if (ecpmE3 != null) {
            //ecpmE3 千分比,需要除以1000
            return BigDecimal.valueOf(ecpmE3).divide(BigDecimal.valueOf(1000), 4, RoundingMode.HALF_UP);
        }
        return null;
    }

    @Named("expireSecondsConvertor")
    default int expireSecondsConvertor(long endTime, long defaultExpireSeconds){
        //endTime和defaultEndTime哪个小返回哪个
        if (endTime > 0) {
            long differenceInSeconds = (endTime - System.currentTimeMillis()) / 1000;
            return (int) Math.min(defaultExpireSeconds, differenceInSeconds);
        }
        return (int) defaultExpireSeconds;
    }
}

只更新部分字段(不是new一个新目标对象),并对部分字段做处理

   @Mapping(source = "ad.id", target = "thirdPartyAdId")
    @Mapping(target = "expire", ignore = true)
    @Mapping(source = "extMap", target = ".")
    void toUserVO2(com.tencent.platform.ad.mixer.protocol.entity.Ad tencentAd,  @MappingTarget Ad ad);

也可以引入Spring的Bean,使用已有的方法做逻辑处理

@Mapper(componentModel = "spring")
public abstract class YyyMapper{

    @Autowired
    protected AdService adService;
    
    @Mapping(target = "imei", expression = "java(adService.encryptImei(ad.getImei()))")
    public abstract Ad sourceToTarget(TencentAd ad);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值