• mapstruct进阶属性


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

    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2. @BeanMapping (ignoreUnmappedSourceProperties)

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

    3. @Mapping (qualifiedByName )

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

    TimeChangeWorker

    @Component
    @RequiredArgsConstructor
    public class TimeChangeWorker {
    
        @Named("timeChange")
        public String timeChange(String time) {
            return time.replaceAll("~", "-");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    后面遇到新的场景再更新

  • 相关阅读:
    使用opencv实现图像的畸形矫正:仿射变换
    SpringSecurity - SecurityContextHolder 源码分析
    stm32f334高级定时器TIM1
    react-router 如何在组件外路由跳转
    java计算机毕业设计旅游景点展示平台的设计与实现源程序+mysql+系统+lw文档+远程调试
    数据可视化项目管理软件推荐:提升团队效率的利器
    代码随想录训练营第56天|583.两个字符串的删除操作,72.编辑距离
    Python中日志异步发送到远程服务器
    浏览器下载快捷方式到桌面(PWA)
    前端TypeScript学习day01-TS介绍与TS常用类型
  • 原文地址:https://blog.csdn.net/weixin_43861630/article/details/126299958