gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:55:34 24 4
gpt4 key购买 nike

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"

中间值 = "123.456"

结束值 = "AB"

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

这就是为什么我已经写了一个自定义映射器,我告诉 MyMapper 通过
@Mapper(componentModel = "spring", uses = MyCustomMapper.class)

到目前为止,这是有效的,但是当源带有“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 转换为您的类。您甚至可以将其作为我编写的 @BeforeMapping 的一部分并直接创建您的类(或调用将 String 转换为类的方法)

关于mapping - 如何使用 MapStruct 1.2 有条件地映射属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49067870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com