Mapstruct:自动递增对象列表中的对象变量
Mapstruct: Auto-increment a object variable in a list of objects
我有一些这样的 POJO:
@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;
}
现在我想使用 MapStruct 将 class C 映射到 class A,这样 class A 中 bList 中的 id 值会自动递增。我正在使用 Mapstruct 1.1.0.Final.
为了将 List<D>
映射到 List<B>
,我可以为 class B
和 class D
定义一个映射器,POJO 会自动映射,但找不到我可以映射 POJO 以及在字段上自动递增的方式。
我的 POJO 非常大。 Map Struct 中有没有一种方法可以在列表中自动递增变量?
对于 1.1.0.Final,您有 2 个选择,对于 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 也可以调用静态方法。
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
(s)。
我有一些这样的 POJO:
@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;
}
现在我想使用 MapStruct 将 class C 映射到 class A,这样 class A 中 bList 中的 id 值会自动递增。我正在使用 Mapstruct 1.1.0.Final.
为了将 List<D>
映射到 List<B>
,我可以为 class B
和 class D
定义一个映射器,POJO 会自动映射,但找不到我可以映射 POJO 以及在字段上自动递增的方式。
我的 POJO 非常大。 Map Struct 中有没有一种方法可以在列表中自动递增变量?
对于 1.1.0.Final,您有 2 个选择,对于 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 也可以调用静态方法。
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
(s)。