mapstruct进阶属性

最基本的如何使用、引包、基础的注解和属性就不介绍了

演示版本 version: 1.5.2.Final

1. @DecoratedWith 用于自定义转换器

HospitalInfoConverter

@Mapper(componentModel = "spring")
@DecoratedWith(HospitalInfoConverterPost.class)
public interface HospitalInfoConverter {

    @Mapping(target = "id", source = "hosId")
    @Mapping(target = "name", source = "hosName")
    @Mapping(target = "addr", source = "address")
    @Mapping(target = ".", source = "cityName")
    @Mapping(target = ".", source = "district")
    @Mapping(target = ".", source = "level")
    @Mapping(target = ".", source = "latitude")
    @Mapping(target = ".", source = "longitude")
    @BeanMapping(ignoreUnmappedSourceProperties = { "hosArea" })
    OrgInfoDto hosToOrgInfoDto(HospitalResult hospitalResult);
}

HospitalInfoConverterPost (必须是抽象类 abstract )

@Slf4j
public abstract class HospitalInfoConverterPost implements HospitalInfoConverter {

    @Autowired
    @Qualifier("delegate")
    private HospitalInfoConverter delegate;

    @Override
    public OrgInfoDto hosToOrgInfoDto(HospitalResult hospitalResult) {
        log.info("hosToOrgInfoDto");
        OrgInfoDto orgInfoDto = delegate.hosToOrgInfoDto(hospitalResult);
        orgInfoDto.setId(orgInfoDto.getId() + SPLIT + hospitalResult.getHosArea());
        return orgInfoDto;
    }
}

2. @BeanMapping (ignoreUnmappedSourceProperties)

属性ignoreUnmappedSourceProperties的使用,在上面的HospitalInfoConverter 转换器中有这个注解属性的使用,此属性就是忽略源类中的属性值,不去进行映射

2.1 和不映射的目标策略一样的结果(unmappedTargetPolicy )

使用MapStruct unmappedTargetPolicy提供所需的行为:
@Mapper(componentModel = “spring”, unmappedTargetPolicy = ReportingPolicy.IGNORE)
ERROR:任何未映射的目标属性都将使构建失败–这可以避免意外的未映射字段
WARN:(默认)构建期间的警告消息
IGNORE:无输出或错误

3. @Mapping (qualifiedByName )

此属性就是当前映射关系使用自定的方法去转换,是方法,与自定义实现类是有区别的

TimeChangeWorker

@Component
@RequiredArgsConstructor
public class TimeChangeWorker {

    @Named("timeChange")
    public String timeChange(String time) {
        return time.replaceAll("~", "-");
    }

}

PeriodConverter 转换器
注意: Mapper中要增加属性uses ,将自定义的类引入使用
qualifiedByName 属性引入 @Named中的别名

@Mapper(componentModel = "spring", uses = { TimeChangeWorker.class })
public interface PeriodConverter {

    @Mapping(target = "time", source = "time", qualifiedByName = "timeChange")
    Period sourceToPer(SourceDto dto);

    List<Period> sourcesToPeriods(List<SourceDto> sourceDtos);

}

4. @Mapping (expression)

执行表达式,可以是执行一个方法
expression = “java( xxxxx类路径.方法名(参数(源类的属性),参数(源类的属性)))”)
OrderInfoConverter转换器

@Mapper(componentModel = "spring", uses = { OrderInfoWorker.class })
//@DecoratedWith(value = OrderInfoConverterPost.class)
public interface OrderInfoConverter {

    @Mapping(target = "smallPicture", source = "smallPicture", qualifiedByName = "imageUrl")
    @Mapping(target = "orderPrice", ignore = true)
    @Mapping(target = "orderCountPrice", ignore = true)
    @Mapping(target = "orgId", expression = "java( com.shunnengnet.tijian.openapi.converter.conversionWorker.OrderInfoWorker.jsonToOrg(dto.getThirdPartyApply(),dto.getOrgId()))")
    @Mapping(target = "orgName", expression = "java( com.shunnengnet.tijian.openapi.converter.conversionWorker.OrderInfoWorker.jsonToOrg(dto.getThirdPartyApply(),dto.getOrgName()))")
    OrderInfoResult dtoToEntity(OrderInfoResultDto dto);

    default List<OrderInfoResult> dtoListToEntityList(List<OrderInfoResultDto> dto) {
        List<OrderInfoResult> orderInfoResults = new ArrayList<>();
        dto.forEach(item -> {
            orderInfoResults.add(dtoToEntity(item));
        });
        return orderInfoResults;
    }

}

OrderInfoWorker


@Component
@Slf4j
public class OrderInfoWorker {

    @Named(value = "imageUrl")
    public String image(String url) {
        return ConfigConstant.IMAGE_URL_PREFIX + url;
    }

    public static String jsonToOrg(String jsonStr, String key) {
        JSONObject jsonObject = JSON.parseObject(jsonStr);
        JSONObject applyParam = jsonObject.getJSONObject(SNAPSHOT_JSON_THIRD_PARTY_APPLY);
        return applyParam.getString(key);
    }

}

5. @Mapping(defaultExpression)

以表达式结果为默认值

**AfterDiagPatientPojoMapper **

@Mapper(componentModel = "spring", imports = { IdNoUtils.class, SecurityUtils.class}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface AfterDiagPatientPojoMapper {

    @Mapping(target = "checkInNo", source = "checkInNo", defaultExpression = "java(IdNoUtils.getCheckInNo())")
    AfterDiagPatientEntity addPojoToEntity(AfterDiagPatientPojo pojo);
}

IdNoUtils

public class IdNoUtils {

	public static final DateTimeFormatter Y_M_D = DateTimeFormatter.ofPattern("yyyyMMdd");
	
    /**
     * 获取申请编号
     * @return String
     */
    public static String getCheckInNo() {
        Snowflake snowflake = IdUtil.getSnowflake(2L, 2L);
        long l = snowflake.nextId();
        String s = String.valueOf(l);
        return LocalDate.now().format(Y_M_D) + s.substring(s.length() - 6);
    }
}

后面遇到新的场景再更新

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值