[英]MapStruct Retrieving from arrayList
我正在尝试使用MapStruct映射两个对象。 我已经搜索了一段时间,但找不到任何东西,尽管我是编程的新手,所以我确信它比我做的要容易。
这是一些剥离的代码(请注意,实际代码更加复杂,arraylist中的子对象与目标对象的子变量的类型不同,这里是这样):
SourceObject
public class SourceObject {
public ArrayList<ListObject> list = new ArrayList<ListObject>();
public SourceObject() {
list.add(new ListObject());
}
}
的ListObject
public class ListObject {
public DetailsObject details = new DetailsObject();
public ListObject() {
details.forename="SourceForename";
details.surname="SourceSurname";
}
}
DestinationObject
public class DestinationObject {
public DetailsObject details = new DetailsObject();
public DestinationObject() {
details.forename="DestinationForename";
details.surname="DestinationSurname";
}
}
DetailsObject
public class DetailsObject {
public String forename;
public String surname;
}
映射器
@Mappings({
@Mapping(target="details.forename", source="list.get(0).details.forename"),
@Mapping(target="details.surname", source="list.get(0).details.surname"),
})
DestinationObject toDestination(SourceObject source);
如果将DetailsObject直接放在SourceObject中,这将很好地工作,但是当我尝试从列表中获取它时,这将成为一个问题。 我得到的错误是:
[错误]无法在项目模板上执行目标org.apache.maven.plugins:maven-compiler-plugin:3.5.1:compile(默认编译):编译失败:编译失败:
[错误] ... / src / main / java / Mapper / SourceToDestinationMap.java:[12,13]源参数中不存在名为“ list.get(0).details.surname”的属性。 您是说“ list.empty”吗?
[错误] ... / src / main / java / Mapper / SourceToDestinationMap.java:[11,9]源参数中不存在名为“ list.get(0).details.forename”的属性。 您是说“ list.empty”吗?
编辑:映射器的当前状态:
@Mapper
public interface SourceToDestinationMap {
@Mapping(target = "details", source = "list")
DestinationObject toDestination(SourceObject source);
default DetailsObject map(List<ListObject> source) {
return map(source.get(0));
}
DetailsObject map(ListObject source);
}
您尝试做的映射是不可能的,因为您正在混合bean属性和bean函数。
您不能使用@Mapping(source = "list.get(0).XXX")
。 尚不支持使用索引访问列表的元素,请参阅#1321 。
解决问题的一种方法是使用限定符,就像在mapstruct-iterable-non-iterable示例中使用限定符一样。
或者,您可以提供自己的执行映射的方法。
@Mapper
public interface MyMapper {
@Mapping(target = "details", source = "list")
DestinationObject toDestination(SourceObject source);
default DetailsObject map(List<ListObject> source) {
return source != null && !source.isEmpty() ? map(source.get(0)) : null;
}
DetailsObject map(ListObject source);
}
然后,MapStruct将生成正确的代码。
另一种选择是使用@Mapping(expression="java()"
。
然后,您的映射器将如下所示:
@Mapper
public interface MyMapper {
@Mapping(target = "details.forename", expression = "java(source.list.get(0).details.forename)")
@Mapping(target = "details.surname", expression = "java(source.list.get(0).details.surname)")
DestinationObject toDestination(SourceObject source);
}
expression
。 MapStruct将按原样使用表达式中的文本,并且不会执行任何验证检查。 因此,它可以是一个有点脆,因为不会有null
和空检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.