如何告诉Dozer在目标字段中使用LinkedHashSet集合?

时间:2012-06-08 09:35:05

标签: java mapping dozer

在头等舱我有字段:

private Set<Country> countries;

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

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

将包含LinkedHashSet实现。

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

1 个答案:

答案 0 :(得分:2)

当Dozer映射Set时,它使用org.dozer.util.CollectionUtils.createNewSet创建目标Set实例。您可以获得HashSetTreeSet

如果元素的顺序与其自然顺序相同,则可以在目标中使用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>