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);
    }
}

后面遇到新的场景再更新

猜你喜欢

转载自blog.csdn.net/weixin_43861630/article/details/126299958