Mapping di dozer non banali
Domanda
Sto lottando per ottenere Dozer Piegare alla mia volontà per qualcosa che ritengo dovrebbe essere abbastanza semplice. Ho due modelli simili da cui desidero mappare, tuttavia uno ha una gerarchia "più profonda" dell'altra e questo mi sta causando problemi quando ho a che fare con le collezioni. Considera le seguenti classi:
Classi di origine:
class Foo {
String id;
NameGroup nameGroup;
// Setters/Getters
}
class NameGroup {
private List<Name> names;
// Setters/Getters
}
class Name {
private String nameValue;
// Setters/Getters
}
Classi di destinazione:
class Bar {
private String barId;
private BarNames barNames;
// Setters/Getters
}
class BarNames {
private List<String> names;
// Setters/Getters
}
Ora vorrei le seguenti mappature a senso unico:
Foo.id -> Bar.barId // Simple enough
Ma quindi ho bisogno:
Foo.nameGroup.names.nameValue -> Bar.barNames.names
Quindi ciascuno Name
istanza in Foo.nameGroup.names
dovrebbe provocare a String
essere aggiunto al BarNames.names
elenco. È possibile?
Soluzione
Questo può essere facilmente fatto con Dozer fintanto che la tua classe "Nome" contiene un costruttore di stringhe.
Una citazione dei dottori di Dozer (http://dozer.sourceforge.net/documentation/simpleproperty.html):
La copertura del tipo di dati viene eseguita automaticamente dal motore di mappatura Dozer. Attualmente, Dozer supporta i seguenti tipi di conversioni: (Questi sono tutti bidirezionali)
...
String su tipo complesso se il tipo complesso contiene un costruttore di stringhe
...
L'ho testato con le tue lezioni come sopra (ero bloccato con lo stesso problema) e funziona perfettamente. Ecco la mappatura che ho usato:
<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>