java MapStuct策略更新字段列表

zpgglvta  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(130)

我有两个类实体的父子关系:

public class Parent {
  private String name;
  private List<Child> children;
}
public class Child {
  private String name;
}

我需要两个Map器更新方法,一个完全替换集合,另一个向集合添加新元素。

@Mapper(
    componentModel = "spring",
    uses = {ChildMapper.class})
public interface ParentMapper {
Parent updateParent(ParentTo to, @MappingTarget Parent parent); //works correctly

Parent updateParentAddChild(ParentTo to, @MappingTarget Parent parent); //it does not work correctly
}

默认情况下,更新时,Map器将替换集合中的所有实体。
在Map器中通过向工作表中添加元素来实现实体更新,如何才能更正确?

xqkwcwgp

xqkwcwgp1#

它们都能正常工作,但是它们做了同样的事情。您只更改了名称,这就是实现保持不变的原因。
“完全替换”是一种常见的行为,所以为了完全替换集合,你已经做了什么就可以了。

Parent updateParent(ParentTo to, @MappingTarget Parent parent);

相反,如果您需要特定的实现(比如通过添加新元素来更新集合),您可以简单地使用自定义实现创建一个方法:

@Mapping(target = "children", expression = "java(updateChildrenList(to, parent))")
Parent updateParentAddChild(ParentTo to, @MappingTarget Parent parent);

default List<Child> updateChildrenList(ParentTo to, Parent parent) {

    //add here your custom mapping implementation

}

如果需要,还可以应用一个名为ADDER_PREFERRED的CollectionMappingStrategy来覆盖默认行为。
您可以在Baeldung上找到更多相关信息:集合Map策略

相关问题