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”时。
你无法用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
转换为类的方法)