【发布时间】:2017-05-31 03:38:45
【问题描述】:
考虑以下情况:
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 需要映射到 SomeObject 中的 stringSomeObject。我试图为此编写一个 Orika-Mapper:
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 例如...
好的,我找到了一个解决方案...不!这不是一个解决方案,它只是一种解决方法。我也将stringA 定义为List<String>,并定义了一个扩展CustomConverter<String, LoanContrReqERPCrteReqLoanContrBrrwrPty> 的转换器。
因为这感觉有点“hacky”,所以我仍然对一个好的解决方案感兴趣。 (虽然我只是认为这个解决方案可能很好:现在两个对象的数据结构比以前更平等。问题是,对象B 来自外部服务,我无法修改它。)
【问题讨论】:
标签: java unit-testing converter mapper orika