3

ファーストクラスにはフィールドがあります:

private Set<Country> countries;

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

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

LinkedHashSet 実装が含まれます。

2 番目のクラスには同一の宣言がありますが、マッピング中に Dozer は宛先クラスに HashSet 実装を作成し、要素の順序を破壊します。Dozer に宛先クラスで LinkedHashSet を使用するように指示するには?

4

1 に答える 1

2

Dozer が をマップするときSet、 を使用しorg.dozer.util.CollectionUtils.createNewSetて宛先Setインスタンスを作成します。HashSetまたはのいずれかを取得しますTreeSet

要素の順序が自然な順序と同じである場合は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 に答える