[英]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.