J'ai un ensemble de classes générées par JAX-WS qui sont dupliquées dans un autre paquet. Maintenant, je veux mapper entre ces classes en utilisant Dozer. Le problème que j'ai maintenant est basé sur JAX-WS ne générant pas de setters pour les types de Collection. Au lieu d'appeler set(List<Foo> foo)
je dois appeler getFoo().addAll(List<Foo>)
. Comment puis-je configurer Dozer (via XML et API) pour respecter cela?Problème de mappage avec les classes générées par Dozer et JAX-WS
1
A
Répondre
2
Ok, je me suis dit comment faire avec une configuration xml dozer statique:
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<mapping>
<class-a>foo.ArrayOfItem
</class-a>
<class-b>bar.ArrayOfItem</class-b>
<field>
<a>item</a>
<b set-method="getItem().addAll">item</b>
<b-hint>bar.Item</b-hint>
</field>
</mapping>
<mapping>
<class-a>foo.Item</class-a>
<class-b>bar.Item</class-b>
</mapping>
je manque le nécessaire au <b-hint>bar.Item</b-hint>
. Maintenant, je dois seulement faire lors de l'exécution via l'API Dozer ...
Cela échoue avec java.lang.ClassCastException: foo.Item cannot be cast to bar.Item
que l'indice est en quelque sorte pas appliquée:
BeanMappingBuilder mappingBuilder = new BeanMappingBuilder() {
@Override
protected void configure() {
mapping(
"foo.ArrayOfItem",
"bar.ArrayOfItem").fields("item", "item",
new FieldsMappingOption() {
public void apply(
FieldMappingBuilder fieldMappingBuilder) {
FieldDefinitionBuilder itemFieldDefinitionBuilder = fieldMappingBuilder
.b("item");
itemFieldDefinitionBuilder
.theSetMethod("getItem().addAll");
}
}).hintB(bar.Item.class);
}
};
Voilà comment cela fonctionne:
BeanMappingBuilder mappingBuilder = new BeanMappingBuilder() {
@Override
protected void configure() {
mapping(
"foo.ArrayOfItem",
"bar.ArrayOfItem").fields("item", "item",
new FieldsMappingOption() {
public void apply(
FieldMappingBuilder fieldMappingBuilder) {
FieldDefinitionBuilder itemFieldDefinitionBuilder = fieldMappingBuilder
.b("item");
itemFieldDefinitionBuilder
.theSetMethod("getItem().addAll");
}
}, FieldsMappingOptions.hintB(bar.Item.class));
}
};
Quelle version du bouteur utilisiez-vous? Autant que je peux dire cela ne fonctionne pas avec le plus récent (5.3.2) –