Mapstruct使用我自己的无参数方法作为List的工厂(而不是构造函数)
我试图映射一些对象树,它应该逐级构建。所以我有一个硬编码根节点的方法和另一种方法,用于将实体映射到节点。所以我有一个生成根名称列表的方法,以及用于映射的抽象方法。
@Mapper
public abstract class TestMapper {
public List<Name> rootNames() {
List<Name> names = new ArrayList<>();
names.add(Name.build("Homer"));
names.add(Name.build("Marge"));
return names;
}
@Mapping(target = "name", source = "name")
public abstract Name childrenName(FullName simpson);
public abstract List<Name> childredNames(List<FullName> children);
public static class Name {
private String name;
public static Name build(String value) {
Name name = new Name();
name.setName(value);
return name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static class FullName {
private String name;
private String lastName;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
}
所以在生成的代码中,“childrenNames”看起来像@Override public List childrenNames(List children){if(children == null){return null; }
List<Name> list = rootNames();
for ( FullName fullName : children ) {
list.add( simpsonName( fullName ) );
}
return list;
}
我如何将我的rootNames方法标记为映射忽略?
最好的祝福。阿列克谢
正如票证https://github.com/mapstruct/mapstruct/issues/1725中所讨论的那样,你应该将@Named
注释添加到你的rootNames()
方法中。如果没有注释,它将被MapStruct自动拾取为对象工厂(请参阅http://mapstruct.org/documentation/dev/reference/html/#object-factories)。
只要一个方法用@Named
注释,它就会在明确引用时被拾取。
@org.mapstruct.Named("rootNames")
public List<Name> rootNames() {
List<Name> names = new ArrayList<>();
names.add(Name.build("Homer"));
names.add(Name.build("Marge"));
return names;
}