1

我有一些这样的 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 将 C 类映射到 A 类,以便 A 类中 bList 中的 id 值自动递增。我正在使用 Mapstruct 1.1.0.Final。

对于映射List<D>List<B>,我可以为 and 定义一个映射器,class B并且class DPOJO 将被自动映射,但找不到一种方法可以将 POJO 与字段上的自动增量一起映射。

我的 POJO 很大。Map Struct 中是否有一种方法可以自动增加列表中的变量?

4

1 回答 1

2

使用 1.1.0.Final 有 2 个选项,使用 1.2.0.Beta2 有另外一个选项。

映射D到时的第一个选项B

您可以使用@AfterMappingbetween DandB并使用 a ThreadLocalthere。

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第三种方法。

于 2017-05-27T16:49:35.957 回答