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

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

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,middleValue和endValue:

preValue =“V01”

middleValue =“123.456”

endValue =“AB”

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

这就是为什么我已经编写了一个自定义映射器,并告诉MyMapper通过它来使用它

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

这个工作到目前为止,但我无法实现它告诉MyCustomMapper将“V01.123.456.AB”放入目标,当souzrce带有“ABC”时。

mapping conditional mapstruct
1个回答
6
投票

你无法用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转换成你的班级。您甚至可以将此作为我编写的@BeforeMapping的一部分并直接创建您的类(或调用从String转换为类的方法)

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