指定MapStruct将用于隐式映射的对象名称

问题描述 投票:0回答:1

我想知道是否有可能在 MapStruct 中明确指定什么对象将用于在传递给映射器的参数中进行隐式映射,我有以下示例:

@Mapping(target = "ca1", source = "a.ca1")
@Mapping(target = "ca2", source = "a.ca2")
C mapFrom(A a, B b);

我想将 A 用于显式映射,将 B 用于所有隐式映射,问题是 A 和 B 有很多同名属性冲突在一起,我尝试使用

@Mapping(target = ".", source = "b")

但这并没有解决问题,我仍然得到 java: Several possible source properties for target property... 错误,同时使用

@BeanMapping(ignoreByDefault = true)
将变得非常困难,因为我将不得不手动编写大量映射。我认为如果我们可以指定将用于隐式映射的对象,那将非常方便,有什么帮助吗? (我使用的是 1.5.2 版本)

java mapstruct
1个回答
0
投票

根据 MapStruct 文档

如果多个源对象定义了同名的属性, 从中检索属性的源参数必须是 使用 @Mapping 注释指定,如描述所示 示例中的属性。当这样的 歧义没有解决。

但是,可以通过下一个 3 种方法的解决方法来实现所需的功能:

@Mapper
public interface TestMapper {

    TestMapper INSTANCE = Mappers.getMapper(TestMapper.class);

    default ResultClass combineOrdered(ImplicitClass implicitClass, ExplicitClass explicitClass) {
        ResultClass resultClass = populateImplicitly(implicitClass);
        populateExplicitly(resultClass, explicitClass);
        return resultClass;
    }

    ResultClass populateImplicitly(ImplicitClass implicitClass);

    @BeanMapping(ignoreByDefault = true)
    @Mapping(source = "explicitClass.explicitField", target = "explicitField")
    void populateExplicitly(@MappingTarget ResultClass resultClass, ExplicitClass explicitClass);
}

MapStruct 将为

populateImplicitly
方法生成代码以隐式填充 ImplicitClass 中的所有字段 - 以及为
populateExplicitly
方法生成代码以仅显式填充 ExplicitClass 中声明的字段。

这两种方法可以使用额外的方法组合

combineOrdered
- 首先调用隐式映射(以填充所有字段) - 然后将仅填充显式字段。

使用这种

combineOrdered
方法应该有助于做你正在寻找的东西。

© www.soinside.com 2019 - 2024. All rights reserved.