使用 1.1.0.Final 有 2 个选项,使用 1.2.0.Beta2 有另外一个选项。
映射D
到时的第一个选项B
您可以使用@AfterMapping
between D
andB
并使用 a ThreadLocal
there。
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 也可以调用静态方法。
1.2.0.Beta2 的第三个选项
您可以使用新的@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, new AutoIncrementorContext());
第一种和第三种方法相似,唯一的区别是您不必使用ThreadLocal
第三种方法。