我很难让Dozer屈服于我的意志,因为我觉得这应该很简单。我有两个相似的模型,我想在它们之间进行映射,但是一个具有比另一个更“深”的层次结构,这在处理集合时会引起我的问题。请考虑以下类:
源类:
class Foo {
String id;
NameGroup nameGroup;
// Setters/Getters
}
class NameGroup {
private List<Name> names;
// Setters/Getters
}
class Name {
private String nameValue;
// Setters/Getters
}
目的地课程:
class Bar {
private String barId;
private BarNames barNames;
// Setters/Getters
}
class BarNames {
private List<String> names;
// Setters/Getters
}
现在我想要以下单向映射:
Foo.id -> Bar.barId // Simple enough
但我需要:
Foo.nameGroup.names.nameValue -> Bar.barNames.names
因此,Name
中的每个Foo.nameGroup.names
实例都会导致将String
添加到BarNames.names
列表中。这可能吗?
答案 0 :(得分:5)
只要您的“Name”类包含String构造函数,就可以使用Dozer轻松完成。
Dozer文档(http://dozer.sourceforge.net/documentation/simpleproperty.html)的引用:
执行数据类型转换 由Dozer映射自动完成 发动机。目前,Dozer支持 以下转换类型:(这些 都是双向的)
...
String to 复杂类型,如果复杂类型 包含一个String构造函数
...
我已经用上面的课程测试了这个(我遇到了同样的问题)并且它完美无缺。这是我使用的映射:
<mapping>
<class-a>com.test.bar.Bar</class-a>
<class-b>com.test.foo.Foo</class-b>
<field>
<a>barId</a>
<b>id</b>
</field>
<field>
<a>barNames.names</a>
<b>nameGroup.names</b>
<a-deep-index-hint>java.lang.String</a-deep-index-hint>
<b-deep-index-hint>com.test.foo.Name</b-deep-index-hint>
</field>
</mapping>