gpt4 book ai didi

java - Mapstruct:使用合格的 IterableMapping 映射列表属性

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

首先,如果这个问题已经被提出,请允许我道歉。我在 StackOverflow 中找不到任何引用。

我试图通过 MapStruct 在 bean 之间的映射中使用限定,以便通过限定映射在列表之间进行转换。唉,没有成功。

假设我们有以下类(尽可能简化,并且我将省略明显的 getter/setter):

public class A {
private String propertyA;
}
public class B {
private String propertyB;
private A instanceA;
}
public class C {
private List<B> instancesB;
}

public class A1 {
private String propertyA;
}
public class B1 {
private String propertyB;
private A1 instanceA1;
}
public class C1 {
private List<B1> instancesB1;
}

让我们假设有以下限定符:

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface Full{}

我们还假设有以下映射:

@Mapper
public interface MapperA {
A1 toA1(A a);
A toA(A1 a1);
}
@Mapper
public interface MapperB {
B1 toB1(B b);
@Mapping(source="propertyA", target="propertyA1")
@Full
B1 toB1Full(B b);
@IterableMapping(qualifiedBy=Full.class)
@Full
List<B1> toB1s(List<B> bs);
toB(B1 b);
@Mapping(source="propertyA1", target="propertyA")
@Full
toBFull(B1 b);
@IterableMapping(qualifiedBy=Full.class)
@Full
List<B> toBs(List<B1> bs);
}
@Mapper
public interface MapperC {
<HERE IS THE PROBLEM>
}

如何编写 Mapper C 以便对 B 的迭代实例使用完整映射?

无论我如何尝试编写映射的注释,例如

@Mapping(source = "instancesB1", target="instancesB", qualifiedBy=Full.class)

我总是发现自己的映射实体不完整:B1 实例具有正确映射的 propertyB 字段,但没有 instanceA1

我当然可以将 MapperC 编写为抽象类,实现该方法,手动调用映射器并对此感到满意,但我怀疑是否可以以某种方式进行注释MapperC 中的方法并让 Mapstruct 自动为我使用正确的映射方法(因为这是一个过于简单的情况,但我可能有数十个这样的列表需要转换)。

感谢您的关注。

最佳答案

不确定您是否尝试过,但从示例来看,似乎缺少 Mapper#uses

在您的情况下,它应该看起来像(省略映射方法):

@Mapper
public interface MapperA {

}

@Mapper(uses = MapperA.class)
public interface MapperB {

}

@Mapper(uses = MapperB.class)
public interface MapperC {

}

当您使用Mapper#uses时,MapStruct将在uses中定义的类中查找合格的方法。但是,如果您没有,那么 MapStruct 就无能为力,并且会生成一些默认映射。

关于java - Mapstruct:使用合格的 IterableMapping 映射列表属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55483155/

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