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

Mapping 如何使用MapStruct 1.2有条件地映射属性?,mapping,conditional,mapstruct,Mapping,Conditional,Mapstruct,MapStruct 1.2是否可以将具有特定值的源属性映射到目标中的特定不同值 我会这样想: public abstract class JiraKpmMapper { @Mappings({ @Mapping(source = "mySource.propA", target = "myTarget.propX") }) @ValueMappings({ @ValueMapping(source = "ABC", target = "XYZ"),

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”,以此类推

更准确地说,我甚至想要更详细的东西: 目标应该是三个属性的类,其中结果目标值必须拆分为三个属性。 例如,如果mySource.propA的值为“ABC”,那么目标myTarget应该获得类似“V01.123.456.AB”的值。该值应依次分为前值、中间值和结束值:

preValue=“V01”

middleValue=“123.456”

endValue=“AB”

因此没有包含完整结果字符串的属性

这就是为什么我已经编写了一个自定义映射程序,我告诉我的映射程序通过

@Mapper(componentModel = "spring", uses = MyCustomMapper.class)

到目前为止,这是可行的,但我无法做到,当souzrce带有“ABC”时,告诉MyCustomMapper将“V01.123.456.AB”放入目标中。

使用MapStruct确实无法做到这一点。
@ValueMapping
注释用于映射
Enum

为了实现您想要的目标,您需要在
@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
转换为您的类。您甚至可以在我编写的
@BeforeMapping
中这样做,并直接创建类(或调用将
字符串
转换为类的方法)

您可以这样做

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

这正是我想做的。我与另一个属性类似,但是我必须将该值放入目标类的引用mebmer的属性中。在这种情况下,我必须在'@AfterMapping'中执行这些操作,因为否则引用的对象要么为null,要么如果我使用默认构造函数手动创建它,那么它在MapStruct完成其工作后就会消失。此外,在“@AfterMapping”中执行您建议的操作更好,因为在“@BeforeMapping”中拆分源值时,我必须在目标类的某个属性中缓冲目标值。如果您忽略该属性,则MapStruct不应覆盖任何内容。在任何情况下,由您决定哪一点最适合您的转换。我不太清楚你的全部细节。