如何使用 MapStruct 1.2 有条件地映射属性?

How can I map properties conditionally with MapStruct 1.2?

是否可以使用 MapStruct 1.2 将具有特定值的源 属性 映射到目标中的特定不同值?

我在想这样的事情:

public abstract class JiraKpmMapper {
    @Mappings({
    @Mapping(source = "mySource.propA", target = "myTarget.propX")
    })
    @ValueMappings({
        @ValueMapping(source = "ABC", target = "XYZ"),
        @ValueMapping(source = "123", target = "789")
    })
    public abstract MyTarget source2Target(final MySource mySource);

}

所以当MapStruct在映射过程中看到当mySource.propA有值"ABC"时myTarget.propX需要设置为值"XYZ"等等。

更准确地说,我什至想要更详细的东西: 目标应该是 class haven 三个属性,其中生成的目标值必须拆分为。 例如,如果 mySource.propA 的值为 "ABC",则目标 myTarget 应获得类似 "V01.123.456.AB" 的值。该值又应分为 preValue、middleValue 和 endValue:

preValue = "V01"

middleValue = "123.456"

endValue = "AB"

因此没有 属性 保存完整的结果字符串。

这就是为什么我已经编写了自定义映射器并告诉 MyMapper 通过

使用它的原因
@Mapper(componentModel = "spring", uses = MyCustomMapper.class)

这到目前为止有效,但当 souzrce 带有 "ABC".

时,我无法告诉 MyCustomMapper 将 "V01.123.456.AB" 放入目标中

你不能用 MapStruct 真正做到这一点。 @ValueMapping 注释用于 Enum(s).

的映射

为了实现您正在寻找的内容,您需要在 @BeforeMapping@AfterMapping 中完成。

例如,您可以执行以下操作:

@Mapper
public interface JiraKpmMapper {

    @BeforeMapping
    default void beforeMapping(@MappingTarget MyTarget target, MySource source) {
        if (source.getPropY().equals("ABC") {
            target.setPropX("V01.123.456.AB");
        }
    }

    @Mapping(target = "propX", ignore = true) // This is now mapped in beforeMapping
    MyTarget source2Target(final MySource mySource);
}

您的自定义映射器应该有一个 @AfterMapping。将 propX 转换为 class 的位置。您甚至可以将此作为我编写的 @BeforeMapping 的一部分并直接创建您的 class(或调用执行从 String 到 class 的转换的方法)

你可以这样做

@Mapping(target = "myTarget.propX",expression="java(mySource.getPropA().equals(\"Abc\")?"\"V01.123.456.AB\":\"\")")