Как сообщить Dozer использовать коллекцию LinkedHashSet в поле назначения?

В первом классе у меня есть поле:

private Set<Country> countries;

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

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

который будет содержать реализацию LinkedHashSet.

Во втором классе у меня идентичное объявление, но во время сопоставления Dozer создает реализацию HashSet в целевом классе, что разрушает порядок элементов. Как сообщить Dozer использовать LinkedHashSet в целевом классе?


person Rafał Krętkowski    schedule 08.06.2012    source источник


Ответы (1)


Когда Dozer сопоставляет Set, он использует org.dozer.util.CollectionUtils.createNewSet для создания Set целевого экземпляра. Вы получаете либо HashSet, либо TreeSet.

Если порядок ваших элементов совпадает с их естественным порядком, вы можете использовать SortedSet в пункте назначения. Если нет, то вам нужно самостоятельно создать целевой объект и предоставить желаемую Set реализацию.

Dozer позволяет использовать собственные методы создания или собственные bean factory для создания экземпляров объектов помимо использования конструктора по умолчанию, поэтому вы можете использовать любой метод:

Создать метод

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>
person Bogdan    schedule 10.06.2012