[英]Map a list of object to another list using Dozer's custom converters
我想要做的是使用Dozer將實體列表映射到它們的字符串ID列表(或多或少)。
顯然,它意味着Custom Converter。 我的第一個想法是從MyEntity轉換為String,然后對Dozer說“使用此轉換器映射此集合的每個對象”。 但我無法弄清楚如何做到這一點。
所以我的第二個想法是直接將轉換器形成一個實體列表到一個字符串列表。 關於這個想法我的問題是,我正在討論一些荒謬的事情,即在構造函數中獲取我的列表類型,如下所示(這根本不起作用):
public MyEntityListConverter() {
super(List<MyEntity>.class, List<String>.class);
}
我不知道如何在一行中傳遞一個實例化列表的類,而不會聲明任何內容。
所以如果有人知道:
由於泛型類型,您無法嘗試的方式。 如果是,Dozer無法在運行時檢測類型。
List<>
第一個解決方案
你的轉換器:
public class MyEntityToStringConverter extends DozerConverter<MyEntity, String> {
// TODO constructor + impl
}
你的映射:
mapping(MyEntityA.class, MyEntityB.class)
.fields("myEntityList", "myStringList",
hintA(MyEntity.class),
hintB(String.class));
mapping(MyEntity.class, String.class)
.fields(this_(), this_(), customConverter(MyEntityToStringConverter.class));
帶列表包裝的第二個解決方案
您可以嘗試創建擴展列表impl的自定義類。
public class MyEntityList extends ArrayList<MyEntity> {
}
public class MyStringList extends ArrayList<String> {
}
更改要映射的父類中的字段。
你的轉換器:
public class MyEntityToStringConverter extends DozerConverter<MyEntityList, MyStringList> {
// TODO constructor + impl
}
你的映射:
mapping(MyEntityA.class, MyEntityB.class)
.fields("myEntityList", "myStringList", customConverter(MyEntityToStringConverter.class));
另一種選擇是
super((Class<List<MyEntity>>) (Class<?>) List.class,(Class<List<String>>) (Class<?>) List.class);
我非常傾向於@Ludovic解決方案,但我的評論中可能有一個問題。
但是稍微調整一下對我來說 - 在“配置”而不是字段級別注冊自定義轉換器。 我正在使用XML配置,但它應該與編碼配置一起使用:
<configuration>
<custom-converters>
<converter type="f.q.c.n.MyEntityToStringConverter">
<class-a>java.lang.String</class-a>
<class-b>f.q.c.n.MyEntity</class-b>
</converter>
</custom-converters>
</configuration>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.