我有两个对象有两个单独的字符串表示,我使用Dozer来执行对象到对象的映射。当使用自定义转换器将一个对象上的字符串映射到另一个对象上的字符串时,我遇到运行双向数据转换的问题。
比如说你有:
public class ClassA { private string1; }
和
public class ClassB { private string1; }
数据转换设置如下:
ClassA String ClassB String --------------- --------------- STRING_A_1 <-> STRING_A_2 STRING_B_1 <-> STRING_B_2 STRING_C_xxx <-> STRING_C_xxx
我的映射器设置如下:
public class CustomConverter extends DozerConverter<String, String> implements MapperAware {
public CustomConverter() {
super(String.class, String.class);
}
@Override
public String convertTo(String source, String target) {
return MyEnum.toA(source);
}
@Override
public String convertFrom(String source, String target) {
return MyEnum.toB(source);
}
}
唯一被调用的方法是convertFrom(String, String)
。我尝试实现MapperAware
接口,但没有看到任何加载源类和目标类类型的方法。我希望在任何一种方法中检测出被调用的东西,以找出合适的映射方向。
如何使用我的转换器来检测映射的实际方向应该是什么?
答案 0 :(得分:2)
在Dozer转换器中,convertFrom和convertTo仅根据其参数类型进行调用。不考虑映射配置中的class-a和class-b的顺序。
因此,如您所述,只调用convertFrom。
这里的问题是Dozer正在进行类实例转换,而你真的需要字符串转换。
因此,您需要确定源字符串的格式并手动进行转换。
或者,如果您可以使用JSON,那么JSON解析库将为您执行此操作。例如。在杰克逊:
jsonMapper = new ObjectMapper();
A a = jsonMapper.readValue(new StringReader(source), A.class);
B b = dozerMapper.map(a, B.class);
StringWriter sw = new StringWriter();
jsonMapper.writeValue(sw, b);
target = sw.toString();