的列表,請考慮以下情況:Orika:地圖從字符串到SomeObjects
public class A {
private String stringA;
public String getStringA() {
return stringA;
}
public void setStringA(String stringA) {
this.stringA = stringA;
}
}
public class B {
List<SomeObject> someObjects;
public List<SomeObject> getSomeObjects() {
if (someObjects == null) {
someObjects = new ArrayList<SomeObject>();
}
return someObjects;
}
}
public class SomeObject {
private String stringSomeObject;
public String getStringSomeObject() {
return stringSomeObject;
}
public void setStringSomeObject(String stringSomeObject) {
this.stringSomeObject = stringSomeObject;
}
}
我要地圖從A
到B
。在映射這些時,stringA
需要映射到stringSomeObject
的SomeObject
。我試着寫了這樣的Orika映射器:
public class MyMapper extends ConfigurableMapper {
@Override
protected void configure(MapperFactory factory) {
ConverterFactory converterFactory = factory.getConverterFactory();
converterFactory.registerConverter(new StringToSomeObjectConverter());
factory.classMap(A.class, B.class) //
.field("stringA", "someObjects") //
.byDefault() //
.register();
}
}
它映射類A
到B
,每當遇到從String
轉換到List<SomeObject>
它調用自定義轉換器:
public class StringToSomeObjectConverter extends CustomConverter<String, List<SomeObject>> {
private static final String BORROWER_PARTY_TYP_CODE = "147";
@Override
public List<SomeObject> convert(String source, Type<? extends List<SomeObject>> destinationType) {
SomeObject someObject = new SomeObject();
someObject.setStringSomeObject(source);
return Arrays.asList(someObject);
}
}
我寫的一個單元測試,以確保其工作原理:
@Test
public void testMap() throws Exception {
A a = new A();
a.setStringA("a");
B outcome = new MyMapper().map(a, B.class);
assertThat(outcome.getSomeObjects.size(), is(1));
}
遺憾的是本次測試失敗:
java.lang.AssertionError:
Expected: is <1>
but: was <0>
這似乎是從來沒有執行轉換器,所以我試圖調試它。事實上:調試器永遠不會到達轉換器。難道我做錯了什麼?這好像是。我知道還有更多的方法可以用,比如:mapAToB例如...
好吧,我發現了一個solut ... nah!這不是一個解決方案,它只是一個解決方法。我也將stringA
定義爲List<String>
,並定義了一個擴展CustomConverter<String, LoanContrReqERPCrteReqLoanContrBrrwrPty>
的轉換器。
因爲這感覺有點「哈克」,我仍然對一個很好的解決方案感興趣。 (雖然我只是認爲這個解決方案可能沒問題:現在兩個對象的數據結構比以前更加平等,問題是,該對象B
來自外部服務,我無法修改它。)
請閱讀我的「編輯」 - 部分。我不能修改B類。 – Chris311
好吧,還有一個問題:使用.customize()與自定義映射器並使用Converter之間有什麼區別? – Chris311
如果目標屬性是可分配的(換句話說,如果你有這個字段的設置器),字段的自定義轉換器將被放入生成的映射器中。對於自定義映射器生成的代碼將如下所示: ' b.setField1(a.getField1()); if(customMapper!= null){ customMapper.map(a,b) } ' –