当前位置: 首页 > 知识库问答 >
问题:

MapStruct:自动递增对象列表中的对象变量

牟嘉
2023-03-14
@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;
}

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

共有1个答案

关玄裳
2023-03-14

在1.1.0.final中有两个选项,在1.2.0.beta2中还有一个选项。

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

您可以在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也可以调用静态方法。

您可以使用新的@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,新的AutoIncrementorContext());

第一种方法和第三种方法是相似的,唯一的区别是第三种方法不必使用ThreadLocal(s)。

 类似资料: