Mapperly RMG023错误:如何为映射指定外部来源的必填属性值?
解决MapStruct RMG023错误:补全目标对象非源对象的必填属性
RMG023错误是MapStruct检测到目标对象的必填属性未被映射时触发的。针对你的场景(目标对象B的必填属性不存在于源对象A,但可从外部数据源获取),以下是几种可行的解决方案:
方法1:在映射方法中直接传入外部属性值
直接在映射接口的转换方法里添加对应参数,MapStruct会自动将参数值赋值给目标对象的必填属性:
实体定义
// 源对象A public class SourceA { private String name; // 省略getter/setter } // 目标对象B(requiredCode为必填属性) public class TargetB { private String name; private String requiredCode; // 省略getter/setter }
映射接口
@Mapper public interface ABConverter { ABConverter INSTANCE = Mappers.getMapper(ABConverter.class); @Mapping(target = "name", source = "source.name") TargetB convert(SourceA source, String requiredCode); }
调用示例
// 从外部数据源获取必填属性值 String requiredCode = externalDataSource.getRequiredCode(); TargetB target = ABConverter.INSTANCE.convert(sourceA, requiredCode);
方法2:通过@Mapping的expression注入静态方法返回值
如果必填属性值可通过静态工具类获取,使用expression属性直接调用静态方法赋值:
工具类定义
public class ExternalDataProvider { public static String getRequiredCode() { return externalDataSource.getRequiredCode(); } }
映射接口
@Mapper public interface ABConverter { ABConverter INSTANCE = Mappers.getMapper(ABConverter.class); @Mapping(target = "name", source = "source.name") @Mapping(target = "requiredCode", expression = "java(com.example.ExternalDataProvider.getRequiredCode())") TargetB convert(SourceA source); }
方法3:Spring环境下用@Context注入外部Bean
如果是Spring项目,必填属性来自Spring管理的Bean,使用@Context注解注入Bean并调用其方法:
业务Bean定义
@Component public class CodeService { public String getRequiredCode() { return externalDataSource.getRequiredCode(); } }
映射接口(指定Spring组件模型)
@Mapper(componentModel = "spring") public interface ABConverter { @Mapping(target = "name", source = "source.name") TargetB convert(SourceA source, @Context CodeService codeService); }
调用示例(Spring注入)
@Autowired private ABConverter abConverter; @Autowired private CodeService codeService; public TargetB convertSource(SourceA source) { return abConverter.convert(source, codeService); }
以上三种方法都能让MapStruct识别到必填属性已被显式赋值,从而避免触发RMG023错误。
内容的提问来源于stack exchange,提问作者Richard Collette
相关产品推荐
相关产品推荐

