Spring环境下MapStruct的AMapper如何调用同入参BMapper映射属性
MapStruct 跨Mapper同入参属性映射解决方案
方案1(推荐:编译期类型安全,无需手动写表达式)
你不需要使用expression即可实现需求,直接通过@Mapping注解指定源为整个入参对象即可,MapStruct会自动调用uses中配置的BMapper完成转换:
@Mapper(componentModel = "spring", uses = BMapper.class) public interface AMapper { // source = "." 代表使用方法的整个入参CommonEntity作为转换源 @Mapping(target = "fieldB", source = ".") A mapToDomain(CommonEntity entity); }
原理:MapStruct会自动扫描所有通过uses引入的Mapper,匹配输入参数为CommonEntity、返回值为B类型的转换方法,自动在生成的实现类中注入BMapper并调用,完全避免依赖找不到的问题。
方案2(必须使用expression的正确写法)
你之前报错的核心原因是expression中引用的BMapper实例名错误,Spring组件模型下,MapStruct生成的实现类中注入的BMapper实例默认名称为类名首字母小写的bMapper,正确写法如下:
@Mapper( componentModel = "spring", uses = BMapper.class ) public interface AMapper { @Mapping( target = "fieldB", // 注意这里的实例名是bMapper,入参名要和方法定义的入参名entity保持一致 expression = "java(bMapper.mapToDomain(entity))" ) A mapToDomain(CommonEntity entity); }
内容的提问来源于stack exchange,提问作者2dor
相关产品推荐
相关产品推荐

