假设我有一个对象Foo,它包含对象Bar的引用列表:
public class Foo{
String fooStr;
List<Bar> barList;
//get/set barList/someStr go here
}
public class Bar {
String barStr;
}
使用Dozer,假设Bar到java.util.HashMap是一个简单的映射,我如何将Foo的实例映射到java.util.HashMap的实例,以便将引用的Bar实例映射到java.util .HashMap也是?也就是说,我希望映射的结果是带有键“barList”的HashMap,其中包含ArrayList&gt;的实例。此列表中的每个HashMap都应该是Bar到HashMap的映射。
例如,如果Foo对Bar而不是列表持有一个引用,我会这样做:
<mapping>
<class-a>Foo</class-a>
<class-b>java.util.Map</class-b>
<field>
<a>bar</a>
<b key="bar">this</b>
<a-hint>Bar</a-hint>
<b-hint>java.util.Map</b-hint>
</field>
</mapping>
这会产生一个看起来像这样的hashmap(使用JSON对象来表示HashMaps):
{
"fooStr" : "value of fooStr",
{
"barStr" : "value of barStr"
}
}
但是我想知道如何通过一系列对Bar的引用来表达对HashMap的转换,以便我得到这个:
{
"fooStr" : "value of fooStr",
"barList" : [{ "barStr" : "bar1" }, { "barStr" : "bar2" }, ...]
}
首选不使用自定义映射器的答案,但我知道这是否是实现此行为的唯一方法。
答案 0 :(得分:1)
您应该可以在自定义转换器中执行此操作:
public class Foo {
String fooStr;
List<Bar> barList;
...
}
public class Bar {
String barStr;
}
public class Target {
String fooStr;
Map<String, Bar> barMap;
}
public class TestCustomConverter implements CustomConverter {
public Object convert(Object destination, Object source, Class destClass, Class sourceClass) {
if (source == null) {
return null;
}
if (source instanceof Foo) {
Map<Bar> dest = null;
// check to see if the object already exists
if (destination == null) {
dest = new Target();
} else {
dest = (Target) destination;
}
((Target) dest).setFooStr(source.getFooStr());
for(Bar : source.getBarList()) {
((Target) dest).getBarMap().put(bar.getBarStr(), bar);
}
return dest;
} else if (source instanceof Target) {
Foo dest = null;
// check to see if the object already exists
if (destination == null) {
dest = new Foo ();
} else {
dest = (Foo) destination;
}
dest.getFoos().addAll(((Target)source).getBarMap().values());
dest.setFooStr(((Target)source).getFooStr()):
return dest;
} else {
throw new MappingException("Converter TestCustomConverter used incorrectly. Arguments passed in were:"
+ destination + " and " + source);
}
}
警告:代码可能包含错误,但应该给你一个想法。