2010-11-12 16 views
1

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

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)); 
     } 
    }; 
+1

Quelle version du bouteur utilisiez-vous? Autant que je peux dire cela ne fonctionne pas avec le plus récent (5.3.2) –