Mapping 如何使用MapStruct 1.2有条件地映射属性?
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"),
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不应覆盖任何内容。在任何情况下,由您决定哪一点最适合您的转换。我不太清楚你的全部细节。