Java Mapstruct:在对象列表中自动递增对象变量
我有一些像这样的POJO:Java Mapstruct:在对象列表中自动递增对象变量,java,mapping,mapstruct,Java,Mapping,Mapstruct,我有一些像这样的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; } @数据 公共A类{ 列表列表; } @资料 公共B级{ int-id; int x; } @资料
@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;
}
@数据
公共A类{
列表列表;
}
@资料
公共B级{
int-id;
int x;
}
@资料
公共C类{
名单;
}
@资料
D类公共服务{
int x;
}
现在我想使用MapStruct将类C映射到类A,这样类A中bList中id的值就会自动递增。我正在使用Mapstruct 1.1.0.Final
为了将列表
映射到列表
,我可以为B类
和D类
定义一个映射器,POJO将自动映射,但找不到一种方法可以在字段上映射POJO和自动增量
我的POJO很大。在Map Struct中是否有方法在列表中自动递增变量?对于1.1.0.Final和1.2.0.Beta2,您有两个选项可以执行此操作 将
D
映射到B
时的第一个选项
public class AutoIncrementorBulk {
@AfterMapping
public /*static*/ void autoIncrementId(C source, @MappingTarget A target) {
//here you iterate the list and increment the ids
}
}
您可以在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
}
}
在映射器中,您必须说明您正在使用自动增量线程本地
。方法也可以是静态的,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
}
}
在您的映射器中,您必须说明您正在使用自动增量批量
。方法也可以是静态的,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(一个新的AutoIncrementorContext())代码>
第一种方法和第三种方法相似,唯一的区别是第三种方法不必使用ThreadLocal
。您可以提供更多信息吗。您希望何时执行自动增量?在c
和A
之间映射之后,或者在B
到D
之间映射之后?感谢您的回复。理想情况下,应该是在将D映射到B时。我已经找到了两种解决方案:在抽象类中使用全局线程局部变量,并编写类似java(“getAndIncrement(counter)”)
的表达式,其中getAndIncrement
是获取和递增线程局部变量的方法(虽然不是一个好的解决方案,但因为我有巨大的POJO,所以手动映射将是一项耗时的任务)。第二种解决方案:使用@AfterMapping
注释。将C映射到A后,手动自动递增B列表中的id值。感谢您的回复。在第一个选项中,我们不能在编写方法体时使用局部变量而不是线程局部变量吗?另外,为了避免编写体,我们可以使用线程局部类级别变量并使用expressi在likejava(“getAndIncrement(counter)”)
wheregetAndIncrement
method递增计数器(线程局部变量)根据我在你问题中的理解,你希望A
中的List
具有一些自动递增ID。当将任何D
映射到B
时,将调用第一个选项方法,因此你不能真正使用局部变量,你将使用什么ID?你将始终有一个对象递增?用于你的第二部分。是的你可以使用带有线程本地类级别变量的抽象类,并像那样递增计数器。但是,我更喜欢避免使用表达式,而是使用@AfterMapping
和@Context
。如果可能的话,我更喜欢不使用ThreadLocal
。我可以使用类变量ThreadLocal
更新答案,如果你需要的话这是值得的