3

在头等舱我有领域:

private Set<Country> countries;

public Set<Country> getCountries() {
    return countries;
}

public void setCountries(Set<Country> countries) {
    this.countries = countries;
}

它将包含 LinkedHashSet 实现。

在第二类中我有相同的声明,但在映射期间,Dozer 在目标类中创建 HashSet 实现,这破坏了元素的顺序。如何告诉 Dozer 在目标类中使用 LinkedHashSet?

4

1 回答 1

2

当 Dozer 映射 aSet时,它使用org.dozer.util.CollectionUtils.createNewSet来创建目标Set实例。你得到 aHashSetTreeSet.

如果您的元素的顺序与它们的自然顺序相同,您可以SortedSet在目标中使用 a。如果没有,那么您需要自己创建目标对象并提供所需的Set实现。

Dozer 允许使用自定义创建方法或自定义bean 工厂来实例化对象,而不是使用默认构造函数,因此您可以使用任何一种方法:

创建方法

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>

豆厂

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>
于 2012-06-10T15:46:04.683 回答