gpt4 book ai didi

java - 自动映射除一个字段之外的所有字段,该字段应通过其他函数传递

转载 作者:行者123 更新时间:2023-12-02 10:24:12 38 4
gpt4 key购买 nike

使用Mapstruct,我如何创建一个映射器,它可以自动映射除一个(或两个、三个等)字段之外的所有字段,这些字段应该通过一些自定义映射逻辑传递?

映射器

@Mapper
public interface MyEntityMapper
{
MyEntityMapper INSTANCE = Mappers.getMapper(MyEntityMapper.class);

@Mappings(
{
@Mapping(source = "createdByPerson.id", target = "createdByPersonId"),
})
MyEventPayload toEventPayload(MyEntity entity);
}

如果我有一个 someString 字段,需要先完成一些自定义映射日志记录,我该怎么做?我看到 @Mapping 的这个 argument 选项,但是在注释中的字符串中编写 Java 代码似乎有点疯狂!

我希望做这样的事情:

@MappingFor(MyEntity.class, "someString")
default String mapSomeString(String value) {
return value + " custom mapping ";
}

更新

我找到了@AfterMapping并使用了它,例如:

@AfterMapping
public void mapSomeString(MyEntity entity, MyEventPayload payload) {
// do fancy stuff here
}

但我仍然很好奇您是否可以提供每个字段的后映射/自定义映射功能。

最佳答案

如果您想以特定方式映射单个字段,您可以使用 Mapping methods selection based on qualifiers .

这看起来像

@Mapper
public interface MyEntityMapper {

@Mapping(target = "someString", qualifiedByName = "myFancyMapping")
MyEventPayload toEventPayload(MyEntity entity);

@Named("myFancyMapping") // org.mapstruct.Named
default String mapSomeString(String value) {
return value + " custom mapping ";
}
}

您还可以使用 Mapping#qualifiedBy 并构造您自己的 Qualifier (org.mapstruct.Qualifier) 注释。

这看起来像:

@Qualifier // org.mapstruct.Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface MyFancyMapping {
}

@Mapper
public interface MyEntityMapper {

@Mapping(target = "someString", qualifiedBy = MyFancyMapping.class)
MyEventPayload toEventPayload(MyEntity entity);

@MyFancyMapping
default String mapSomeString(String value) {
return value + " custom mapping ";
}
}

替代方案

另一种方法是在 @AfterMapping 中或使用表达式进行自定义映射(我不建议使用表达式,因为它很容易出错)。

关于java - 自动映射除一个字段之外的所有字段,该字段应通过其他函数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54098168/

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