Mappings Dozer non triviaux
Question
J'ai du mal à obtenir Barrette se plier à ma volonté pour quelque chose qui, selon moi, devrait être assez simple. J'ai deux modèles similaires que je souhaite cartographier entre, mais l'un a une hiérarchie «plus profonde» que l'autre et cela me cause des problèmes lorsqu'il s'agit de collections. Considérez les classes suivantes:
Classes source:
class Foo {
String id;
NameGroup nameGroup;
// Setters/Getters
}
class NameGroup {
private List<Name> names;
// Setters/Getters
}
class Name {
private String nameValue;
// Setters/Getters
}
Cours de destination:
class Bar {
private String barId;
private BarNames barNames;
// Setters/Getters
}
class BarNames {
private List<String> names;
// Setters/Getters
}
Maintenant, je voudrais les mappages à sens unique suivants:
Foo.id -> Bar.barId // Simple enough
Mais j'ai alors besoin:
Foo.nameGroup.names.nameValue -> Bar.barNames.names
Alors chacun Name
instance dans Foo.nameGroup.names
devrait entraîner un String
être ajouté au BarNames.names
liste. Est-ce possible?
La solution
Cela peut facilement être fait avec Dozer tant que votre classe "Name" contient un constructeur de chaînes.
Une citation des documents Dozer (http://dozer.sourceforge.net/documentation/simpleproperty.html):
La housse de type de données est effectuée automatiquement par le moteur de cartographie du banc de bail. Actuellement, Dozer prend en charge les types de conversions suivants: (Ce sont tous bidirectionnels)
...
Chaîne à type complexe si le type complexe contient un constructeur de chaîne
...
J'ai testé cela avec vos cours comme ci-dessus (j'étais coincé avec le même problème) et cela fonctionne parfaitement. Voici la cartographie que j'ai utilisée:
<mapping>
<class-a>com.test.bar.Bar</class-a>
<class-b>com.test.foo.Foo</class-b>
<field>
<a>barId</a>
<b>id</b>
</field>
<field>
<a>barNames.names</a>
<b>nameGroup.names</b>
<a-deep-index-hint>java.lang.String</a-deep-index-hint>
<b-deep-index-hint>com.test.foo.Name</b-deep-index-hint>
</field>
</mapping>