最基本的如何使用、引包、基础的注解和属性就不介绍了
演示版本 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);
}
}
后面遇到新的场景再更新