@Data
public class A {
List<B> bList;
}
@Data
public class B {
int id;
int x;
}
@Data
public class C {
List<D> dList;
}
@Data
public class D {
int x;
}
我的POJO很大。Map Struct中是否有一种方法可以自动增加列表中的变量?
在1.1.0.final中有两个选项,在1.2.0.beta2中还有一个选项。
将D
映射到B
时的第一个选项
您可以在D
和B
之间使用@aftermapping
并在其中使用ThreadLocal
。
public class AutoIncrementorThreadLocal {
@AfterMapping
public /*static*/ void autoIncrementId(D source, @MappingTarget B target) {
//here you use the ThreadLocal and do something like getAndIncrement
}
}
在映射器中,必须说明您使用的是AutoIncrementOrthreadLocal
。而且该方法可以是静态的,MapStruct也可以调用静态方法。
将C
映射到A
时的第二个选项
public class AutoIncrementorBulk {
@AfterMapping
public /*static*/ void autoIncrementId(C source, @MappingTarget A target) {
//here you iterate the list and increment the ids
}
}
在映射器中,必须说明您使用的是AutoIncrementorBulk
。而且该方法可以是静态的,MapStruct也可以调用静态方法。
您可以使用新的@context
并在其上添加@aftermapping
。
public class AutoIncrementorContext {
private int counter = 0;
@AfterMapping
public void autoIncrementId(D source, @MappingTarget B target) {
//here you use your counter, because you are only using this instance during one mapping
}
}
您的映射器需要如下所示:
@Mapper
public interface MyMapper {
C map(A source, @Context AutoIncrementorContext context);
D map(B source, @Context AutoIncrementorContext context);
}
当您要调用映射器时,您需要像这样调用它:
mymapper.map(a,新的AutoIncrementorContext());
第一种方法和第三种方法是相似的,唯一的区别是第三种方法不必使用ThreadLocal
(s)。
给定: 我想把所有的车都标出来。将轮胎分为单独的轮胎板。我知道我可以做一个
假设我有这样的映射: 现在,我需要将子列表映射到子列表,但它们都有相同的父对象。我希望这样做: 但不管用,有机会做吗?
假设我有以下课程:
问题内容: python中是否有办法在适当的位置增加int对象,int似乎未实现,所以+ = 1实际上返回了一个新对象 我想要的是n保持指向同一对象。 目的:我有一个从int派生的类,并且我想为该类实现C型“ ++ n”运算符 结论:好的,因为int是不可变的,看来我将不得不编写自己的类,就像这样 问题答案: int是不可变的,因此如果您想使用“可变的int”,则必须使用所有int的方法来构建自己
下面是我的DTO。 源DTO 目标DTO