【问题标题】:Can't use Mapstruct ADDER_PREFERRED to not clear target list with @MappingTarget不能使用 Mapstruct ADDER_PREFERRED 来清除带有 @MappingTarget 的目标列表
【发布时间】:2021-01-22 15:32:31
【问题描述】:

我的目标是将源对象映射到现有的目标对象,包括一些列表属性(在源和目标中)。 根据documentation

对于 CollectionMappingStrategy.ADDER_PREFERRED 或 CollectionMappingStrategy.TARGET_IMMUTABLE,目标不会被清除,值将立即填充。

这就是我想要的。

所以我正在制作测试课:

@Data
public class MainClass {

class ClassA {
    List<ClassC> list;

}

class ClassB {
    List<ClassD> list;
    
}

class ClassC {

}

class ClassD {

}

}

以及使用 collectionMappingStrategy 和 @MappingTarget 跟随映射器:

@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
public interface TestMapper {

TestMapper MAPPER = Mappers.getMapper( TestMapper.class );

void map(List<MainClass.ClassA> sourse, @MappingTarget List<MainClass.ClassB> target);

MainClass.ClassB map(MainClass.ClassA sourse);

}

但在映射器实现中,我看到 清除目标列表,我不需要:

public class TestMapperImpl implements TestMapper {

@Override
public void map(List<ClassA> sourse, List<ClassB> target) {
    if ( sourse == null ) {
        return;
    }

    target.clear();
    for ( ClassA classA : sourse ) {
        target.add( map( classA ) );
    }
}

@Override
public ClassB map(ClassA sourse) {
    if ( sourse == null ) {
        return null;
    }

    ClassB classB = new ClassB();

    return classB;
}

}

我是在阅读还是做错了?

【问题讨论】:

    标签: mapping mapstruct


    【解决方案1】:

    CollectionMappingStrategy.ADDER_PREFERRED 用于对象的加法器。例如 Car 有一个方法 addWheel(Wheel wheel),并不意味着映射集合。

    CollectionMappingStrategy.TARGET_IMMUTABLE 用于在映射集合属性时不执行clearaddAll。即

    目标访问器(例如 set)将用于目标 bean 来设置集合。

    在您的示例中映射集合时,这两者都没有影响。

    我在这里建议的是使用您自己的自定义映射

    例如

    @Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
    public interface TestMapper {
    
        TestMapper MAPPER = Mappers.getMapper( TestMapper.class );
    
        default void map(List<MainClass.ClassA> source, @MappingTarget List<MainClass.ClassB> target) {
            if ( source == null ) {
                return;
            }
    
            for ( ClassA classA : source ) {
                target.add( map( classA ) );
            }
        }
    
        MainClass.ClassB map(MainClass.ClassA sourse);
    

    【讨论】:

      猜你喜欢
      • 2020-02-08
      • 2023-03-10
      • 2021-12-09
      • 2021-04-22
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      相关资源
      最近更新 更多