You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:50:04