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 Bclass D 定义一个映射器,POJO 会自动映射,但找不到我可以映射 POJO 以及在字段上自动递增的方式。

我的 POJO 非常大。 Map Struct 中有没有一种方法可以在列表中自动递增变量?

对于 1.1.0.Final,您有 2 个选择,对于 1.2.0.Beta2.

,还有一个选择

映射 DB

时的第一个选项

您可以在 DB 之间使用 @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)。