Mapeamentos de calhas não triviais
Pergunta
Estou lutando para conseguir Escavilha curvar -se à minha vontade por algo que eu acho que deveria ser bastante simples. Eu tenho dois modelos semelhantes que desejo mapear, no entanto, um tem uma hierarquia 'mais profunda' do que a outra e isso está me causando problemas ao lidar com coleções. Considere as seguintes aulas:
Classes de origem:
class Foo {
String id;
NameGroup nameGroup;
// Setters/Getters
}
class NameGroup {
private List<Name> names;
// Setters/Getters
}
class Name {
private String nameValue;
// Setters/Getters
}
Classes de destino:
class Bar {
private String barId;
private BarNames barNames;
// Setters/Getters
}
class BarNames {
private List<String> names;
// Setters/Getters
}
Agora eu gostaria dos seguintes mapeamentos unidirecionais:
Foo.id -> Bar.barId // Simple enough
Mas eu então preciso:
Foo.nameGroup.names.nameValue -> Bar.barNames.names
Então, cada um Name
instância em Foo.nameGroup.names
deve resultar em um String
sendo adicionado ao BarNames.names
Lista. Isso é possível?
Solução
Isso pode ser feito facilmente com o Dozer, desde que sua classe "nome" contenha um construtor de string.
Uma citação dos documentos do Dozer (http://dozer.sourceforge.net/documentation/simpleproperty.html):
A cobertura do tipo de dados é realizada automaticamente pelo mecanismo de mapeamento do Dozer. Atualmente, o Dozer suporta os seguintes tipos de conversões: (Estes são todos bidirecionais)
...
String to complex Type se o tipo complexo contiver um construtor de string
...
Eu testei isso com suas aulas como acima (fiquei com o mesmo problema) e funciona perfeitamente. Aqui está o mapeamento que usei:
<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>