如何使用 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\":\"\")")
是否可以使用 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\":\"\")")