我正在尝试使用MapStruct映射两个对象。我已经搜索了一段时间,但没有找到任何东西,尽管我是编程新手,所以我相信这比我现在做的要容易。
下面是一些精简的代码(请注意,真正的代码更复杂,arraylist中的子对象与目标对象子变量的类型不同):
源对象
public class SourceObject {
public ArrayList<ListObject> list = new ArrayList<ListObject>();
public SourceObject() {
list.add(new ListObject());
}
}
可以通过
public class ListObject {
public DetailsObject details = new DetailsObject();
public ListObject() {
details.forename="SourceForename";
details.surname="SourceSurname";
}
}
目标对象
public class DestinationObject {
public DetailsObject details = new DetailsObject();
public DestinationObject() {
details.forename="DestinationForename";
details.surname="DestinationSurname";
}
}
细节主题
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中,这将正常工作,但是当我试图从列表中获取它时,这将成为一个问题。我得到的错误是:
[错误]无法执行目标组织。阿帕奇。专家插件:maven编译器插件:3.5.1:在项目模板上编译(默认编译):编译失败:编译失败:
[错误]/src/main/java/Mapper/SourceToDestinationMap。java:[12,13]源参数中不存在名为“list.get(0).details.nam姓氏”的属性。你是说“名单空了”吗?
[ERROR].../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 to 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);
}
然后,MapSTRt将生成正确的代码。
另一种选择是使用@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);
}
注意表达式
。MapSTRt将按原样使用表达式中的文本,并且不会执行任何验证检查。因此,它可能有点脆弱,因为不会有空检查和空检查。
问题内容: 我正在学习Java,并且遇到了和的问题。 我有一个称为的对象,该对象具有从另一个名为的类创建的对象的数组列表。 我需要一种方法,其中返回item列表中一个对象的所有信息。 该随意选择的需求。 当我尝试编译时,出现错误,指出System.out.println行说.. 问题答案: 是一个方法,调用在你的return语句之后,因此由于无法访问而无法进行编译。 可能希望将其重写为:
问题内容: Java中是否有一种方法,只需指定开始索引和结束索引,即可将对象列表从Arraylist获取到另一个ArrayList? 问题答案: 是的,您可以使用以下方法: 这将返回原始列表那部分的视图,它不会复制数据。 如果要复制:
如何使用ArrayList检索Student类的单个属性,或者检查列表中是否存在“AAA ”?
今天好,这有点让我迷惑(大脑冻结!)好像少了些什么。有一个我用HashMap填充的ArrayList。现在我放入了我的HashMap和ArrayList。 由于am解析JSON,arraylist的大小显著增加。现在我的问题是如何从ArrayList中的两个映射键中获得值?我试过这个 但我似乎不能得到所有的值。映射大小总是返回值2,这只是元素。如何从ArrayList中的映射键获取所有值?谢谢
我正在编写一个程序来模拟咖啡馆中的一个系统,在这个系统中,接受顾客订单的人给顾客一个代币号码,并将顾客的代币号码以及他/她订购的物品输入到一个系统中。recordOrder功能执行此操作,允许输入订单详细信息。订单由令牌ID、tID和表示订单中项目的字符串数组列表表示。 以下是我到目前为止所做的: 问题是,只有我输入的最后一个项目被打印出来,也就是说,假设我输入的令牌编号为9,项目编号为3,项目名
问题内容: 我的arraylist包含String数组对象。我如何获得所有价值?我的代码如下 如果我尝试像上面给出的那样进行检索, 怎么做? 问题答案: 您还必须遍历字符串数组。