2011-04-27 8 views
11

Parece que Dozer no correlacionará una propiedad booleana si el descriptor de esta propiedad se define como isProperty() en lugar de getProperty().dozer Asignación de propiedad booleana

El siguiente guión maravilloso ilustra el problema:

import org.dozer.* 

class ProductCommand { 
    Boolean foo 
} 

public class ProductDto { 

    private Boolean foo;   

    public Boolean isFoo() { this.foo }  
    public void setFoo(Boolean p0) { this.foo = p0 }   
} 

def mapper = new DozerBeanMapper() 

dto = new ProductDto(foo: true) 
assert dto.isFoo() 

ProductCommand mappedCmd = mapper.map(dto, ProductCommand) 
assert mappedCmd.foo 

La afirmación sobre la línea final falla. Sin embargo, si cambio el nombre de ProductDto.isFoo() a ProductDto.getFoo(), pasa.

¿Existe un indicador/opción que pueda establecer en el archivo de mapeo de Dozer que le indicará que use un descriptor de acceso is o get para las propiedades booleanas? Alternativamente, podría agregar una regla personalizada para cada propiedad booleana, pero esto no es muy atractivo.

Aunque el ejemplo anterior está escrito en Groovy, no tengo motivos para creer que el mismo código no mostraría el mismo comportamiento.

Estos DTO son generados por JAXB (que genera un descriptor de acceso "es", en lugar de un "acceso" para booleanos), por lo que no puedo cambiar el nombre de los accesos. Estoy usando Dozer 5.3.2.

+0

¿Está utilizando JAXB a generar tus DTO, por casualidad? – artbristol

+0

sí, ¿hay alguna forma de que pueda generar accesores? –

+0

tenga en cuenta que Dozer solo se comporta de esta manera cuando el método 'is' tiene el tipo' Boolean' - asigna 'boolean isFoo()' métodos finos. –

Respuesta

3

Esto es un error en JAXB, el pequeño-b boolean debe tener isFoo(). Puede usar la opción -enableIntrospection con versiones posteriores de JAXB, o usar el complemento booleano oldish getter xjc plugin http://fisheye5.cenqua.com/browse/~raw,r=MAIN/jaxb2-commons/www/boolean-getter/index.html

+0

Gracias, ¿alguna idea de dónde puedo encontrar este complemento (el enlace de arriba no funciona) y cómo lo uso con la tarea ant 'wsimport'? –

+0

Lo siento, arruiné el enlace. Corregido ahora. – artbristol

+0

Me temo que lo estaba usando con Maven – artbristol

8

Puede ser que pueda usar un método getter personalizado para usarlo.

Aquí está el mapeo ejemplo (Escríbelo en el archivo de empuje-mapping)

<mapping> 
    <class-a>ProductDto</class-a> 
    <class-b>ProductCommand</class-b> 
<field> 
    <a get-method="isFoo">foo</a> 
    <b>foo</b> 
</field> 
</mapping> 

Así que ahora bulldozer utilizará isFoo en lugar de getFoo predefinido. Espero que esto funcione para usted. :)

0

También hay otra forma de lograr la asignación correcta de empuje (el más limpio en mi opinión):

<mapping> 
    <class-a>ProductDto</class-a> 
    <class-b>ProductCommand</class-b> 
    <field> 
     <a is-accessible=”true”>foo</a> 
     <b is-accessible=”true”>foo</b> 
    </field> 
</mapping> 

o la forma ya mencionada anteriormente:

<mapping> 
    <class-a>ProductDto</class-a> 
    <class-b>ProductCommand</class-b> 
    <field> 
     <a get-method=”isFoo”>foo</a> 
     <b>foo</b> 
    </field> 
</mapping> 
Cuestiones relacionadas