在头等舱我有字段:
private Set<Country> countries;
public Set<Country> getCountries() {
return countries;
}
public void setCountries(Set<Country> countries) {
this.countries = countries;
}
将包含LinkedHashSet实现。
在第二个类中,我有相同的声明,但在映射期间,Dozer在目标类中创建HashSet实现,这会破坏元素的顺序。如何告诉Dozer在目标类中使用LinkedHashSet?
答案 0 :(得分:2)
当Dozer映射Set
时,它使用org.dozer.util.CollectionUtils.createNewSet
创建目标Set
实例。您可以获得HashSet
或TreeSet
。
如果元素的顺序与其自然顺序相同,则可以在目标中使用SortedSet
。如果没有,那么您需要自己创建目标对象并提供所需的Set
实现。
Dozer允许使用自定义create methods或自定义bean factories来实例化除使用默认构造函数之外的对象,因此您可以使用任一方法:
创建方法
Java代码:
public class MyInstanceCreator {
public static DestinationObject createDestinationObject() {
DestinationObject result = new DestinationObject();
result.setCountries(new LinkedHashSet<Country>());
return result;
}
private MyInstanceCreator() { }
}
映射:
<mapping>
<class-a create-method="MyInstanceCreator.createDestinationObject">DestinationObject</class-a>
<class-b>SourceObject</class-b>
<field>
<a>countries</a>
<b>countries</b>
</field>
</mapping>
Bean工厂
Java代码:
public class MyBeanFactory implements BeanFactory {
public Object createBean(Object source, Class<?> sourceClass, String targetBeanId) {
DestinationObject result = new DestinationObject();
result.setCountries(new LinkedHashSet<Country>());
return result;
}
}
映射:
<mapping>
<class-a bean-factory="MyBeanFactory">DestinationObject</class-a>
<class-b>SourceObject</class-b>
<field>
<a>countries</a>
<b>countries</b>
</field>
</mapping>