Java Mapstruct:在对象列表中自动递增对象变量

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; } @资料

我有一些像这样的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;
}
@资料
公共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在like
java(“getAndIncrement(counter)”)
where
getAndIncrement
method递增计数器(线程局部变量)根据我在你问题中的理解,你希望
A
中的
List
具有一些自动递增ID。当将任何
D
映射到
B
时,将调用第一个选项方法,因此你不能真正使用局部变量,你将使用什么ID?你将始终有一个对象递增?用于你的第二部分。是的你可以使用带有线程本地类级别变量的抽象类,并像那样递增计数器。但是,我更喜欢避免使用表达式,而是使用
@AfterMapping
@Context
。如果可能的话,我更喜欢不使用
ThreadLocal
。我可以使用类变量
ThreadLocal
更新答案,如果你需要的话这是值得的