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

不能使用Mapstruct ADDER_PREFERRED不清除@mappingtarget的目标列表

傅宏恺
2023-03-14
@Data
public class MainClass {

class ClassA {
    List<ClassC> list;

}

class ClassB {
    List<ClassD> list;
    
}

class ClassC {

}

class ClassD {

}
@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);

}

但是在映射器实现中,我看到清除了Target的列表,我不需要它:

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;
}

}

我是读错了还是做错了?

共有1个答案

裴实
2023-03-14

CollectionMappingStrategy.adder_preferred用于对象上的加法器。例如car具有方法addwheel(Wheel Wheel),并且不用于映射集合。

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

相反,将在目标bean上使用目标访问器(例如set)来设置集合。

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

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

例如。

@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);
 类似资料:
  • 问题内容: 问题是repaint()应该清除框架并在该位置绘制矩形,但是保留先前绘制的矩形。那么,该怎么做呢?请解释您的答案。 问题答案: 您是否尝试过在paintComponent方法中调用super.paintComponent(g)?这将清除您的JPanel中绘制的先前图像: 另外,不要启动计时器或在paintComponent方法内执行任何程序逻辑。首先,您不能完全控制何时或是否将调用该方

  • 我有一个如下定义的表视图 当用户单击时,我使用单击的项目详细信息重新加载表。在我重新加载之前,我对表项调用清除 现在,当我单击另一个项目并尝试重新加载表格时,它看起来像下面这样。这是非常奇怪的,因为应该只有一行,但行的大小是一样的,就像从以前的点击,其余的行是空的,除了图标。当我点击图标时,没有任何反应。任何人以前都面临过这种情况。有人知道这是什么原因吗? 我的工具定义如下。它们只是2 的

  • For方法是在此处生成的,在某些设置器中缺少调用 一些小贴士如何解决这个问题?多谢.

  • 我有一个 A 的任务堆栈 我正在这样设置我的吊挂帐篷。有什么明显的问题吗? 编辑1: 我尝试了这里的建议:清除任务中的所有活动? 但是我仍然得到相同的结果。我的活动A从我的应用程序任务堆栈中开始,我按回并转到C,然后是B,然后又是A。 我开始认为这在Android中是不可能的,或者在使用待定的意图时是不可能的。 编辑2:这不是需要什么标志的问题。更大的问题是什么可能会出错,这些标志似乎没有任何效果

  • 问题内容: 我想清除并更改给定URL上的输入值。我使用的js不会执行任何操作,也不会导致任何错误。为什么会发生这种情况,我该如何解决? 问题答案: 一个可能且可能的答案是,在尝试清除的元素之前,您还有另一个具有相同名称的元素。 请检查html并检查是否找到多个元素,然后采用第一个。 另外,您可以使用css选择器,例如:

  • 我有一个C#平台上的winform项目。我有listview和textbox,如下图所示。我想根据用户输入的文本值对列表重新排序。 我在这里询问之前研究过,我通常会看到基于删除和重新添加所有单元到listview的解决方案。我不想这样做,因为我的listview有太多带图片的项目,所以删除和重新添加项目会导致listview工作缓慢。 我想要的是,当用户在文本框中输入字符时,以这些字符开头的项目,