2010-02-04 8 views
6

Supongamos que tengo las siguientes clasespropiedades de asignación profundas con colecciones intermedias en bulldozer

public class Baz { 
    private List<Foo> foos = new ArrayList<Foo>(); 
} 

public class Foo { 
    private String string; 
} 

public class Target { 
    private List<String> fooStrings = new ArrayList<String>(); 
} 

¿Hay alguna asignación que puedo utilizar para, dada una Baz, el mapa a la clase de destino y obtener una lista de las cuerdas contenido dentro de los foo en Baz? La siguiente asignación no funciona

<mapping> 
    <class-a>Baz</class-a> 
    <class-b>Target</class-b> 
    <field> 
    <a>foos.string</a> 
    <b>fooStrings</b> 
    </field> 
</mapping> 

Porque la cadena no es propiedad de foos (que es del tipo Lista). Pensé que Dozer sería lo suficientemente inteligente como para encontrar una colección en un mapeo profundo, y el objetivo también era una colección, para poder dividir el nombre de la propiedad profunda en dos e iterar a través de la colección para obtener la parte del niño del mapeo profundo de los miembros de la colección. Aparentemente no. ¿Existe una solución para hacer una solicitud de función de Dozer?

+0

¿Cómo está mi pregunta una duplicación de una pregunta que 3 años después de la mía? – Jherico

+0

Posible duplicado por [Dozer deep mapping Establecer en Set ] (http://stackoverflow.com/questions/14212708/dozer-deep-mapping-setcomplexobject-to-setstring). @Jherico, lo siento por la confusión. Stackoverflow solo permite marcar la publicación como un duplicado si la otra contiene una respuesta aceptada. – rafalmag

Respuesta

1

Siempre puede escribir su propio CustomConverter.

tiene sentido por qué bulldozer no es capaz de manejar esto a medida que esperar ya en tiempo de ejecución que no tiene información sobre el tipo List foos y no puede garantizar que todos los Object en la lista es en realidad un Foo.

+1

El trabajo de no dozer es garantizar que cada elemento en una lista sea en realidad un Foo. De hecho, ni siquiera tiene que preocuparse por eso. Todo lo que necesita saber es que los elementos miembros de la lista tienen una propiedad 'cadena', y depende de mí, el desarrollador, para garantizar que ese sea siempre el caso. Escribir un convertidor personalizado para una versión anterior de Dozer es lo que he estado haciendo. Esperaba que en las últimas 2 versiones principales de Dozer alguien hubiera abordado este caso de uso bastante obvio (en mi humilde opinión). – Jherico

0

Creo que puede hacerlo sin un convertidor personalizado.

Reemplazar el método toString() de la clase Foo, como a continuación:

@Override 
public String toString(){ 
return this.getString(); //assuming string property has a getter method. if not,write this.string 

Y ahora el mapeo siguientes aparatos:

<mapping> 
<class-a>fully qualified name of Baz(with package name)</class-a> 
<class-b>same for Target</class-b> 
<field> 
    <a>foos</a> 
    <b>fooStrings</b> 
    <a-hint>foo</a-hint> 
    <b-hint>java.lang.String</b-hint> 
</field> 
</mapping> 
+1

Esa es una solución muy general. Solo le permite seleccionar una sola propiedad por jerarquía de clase * con la que hacer esto, y elimina la funcionalidad existente de toString(), que suele ser muy valiosa para la depuración. – Jherico

1

creo, se puede escribir un mapeo tales

<mapping> 
    <class-a>Baz</class-a> 
    <class-b>Target</class-b> 
    <field> 
    <a>foos</a> 
    <b>fooStrings</b> 
    </field> 
</mapping> 

<custom-converters> 
    <converter type="CustomFooConverter"> 
    <class-a> 
     Foo 
    </class-a> 
    <class-b> 
     String 
    </class-b> 
    </converter> 
</custom-converters> 

E implemente CustomFooConverter para obtener el campo de cadena de foo y devolverlo como una Cadena.

Creo que se puede enviar una solicitud característica de apoyo para el mapeo de primitivas como

<mapping> 
    <class-a>Foo</class-a> 
    <class-b>String</class-b> 
    <field> 
    <a>string</a> 
    </field> 
</mapping> 

en bulldozer GitHub

Cuestiones relacionadas