2008-12-17 29 views
6

En nuestro proyecto tenemos que mapear una estructura anidada de beans en otra. (En realidad, se trata de representaciones en Java mapeadas por JAXB de documentos XML que, por ejemplo, representan un documento de orden entrante). Esto debe asignarse a la estructura de documento de orden completamente diferente de otro sistema.Cómo mapear diferentes estructuras Java-Bean unas a otras

¿Cuáles son las opciones para hacer esto? Yo preferiría algo que cumpla los siguientes requisitos:

  1. El mapeo debe Alérteme cuando el mapeo de un campo no se definió
  2. El mapeo debe tener algunos valores por defecto, como campos de asignación de nombres iguales una sobre otra y proporcionando mapeos estándar para, digamos, int a String y viceversa.
  3. La asignación debe ser bidireccional.
  4. Uno debe ser capaz de utilizar el código de finalización al definir la asignación.

un marco prometedor para esto es Dozer, pero no cumple 1 y 4. Lo mismo con JBeanMapper. Solo programarlo en Java hace 4 pero no los otros requisitos; usar XSLT cumple quizás 2 pero nada más. ¿Tienes mejores ideas?

Respuesta

1

Cuando hemos tenido este problema, hemos terminado haciendo mapeos de campo en Java en una clase de utilidad. Es una verdadera molestia, especialmente cuando tiene que asignar a varios servicios web diferentes y tiene que escribir asignaciones para cada uno de ellos (algunos de los cuales son un simple mapa 2D de atributos con nombre en lugar de una jerarquía de objetos, gritos).

Sin embargo, de esa manera usted tiene la capacidad de analizar los requisitos del objetivo de la asignación para obtener la asignación de la mejor calidad, establecer los valores predeterminados donde no se establecen los datos, y así sucesivamente. Puede lanzar una "UndefinedMappingException" personalizada en su asignador donde lo necesite. Y al no ser una biblioteca esponjosa que utiliza archivos de configuración de mapas XML complejos o de reflexión, es mucho más rápido.

Es decir, esta es la publicación que aboga por "escribir en Java".

1

Resolví un problema similar con commons-beanutils.

Mi objetivo final era un gran archivo Java que construiría la estructura de datos y el mapeador creó ese archivo para mí. De esta forma, podría crear datos de prueba a partir de instantáneas realizadas mientras se ejecutaba el programa.

El asignador permitía definir las claves para ordenar los objetos, el campo que se usaría para generar nombres de objeto en el archivo Java y utilicé un mapa con "clase: campo" como la clave. El valor era un objeto que implementaba una interfaz simple de "Asignación" (un método: toJava (instancia de objeto, campo de cadena, valor de objeto)).

Mi problema principal era compilar archivos de 2MB + Java :)

0

Hay una solución interesante que podría ayudar si usted está correlacionando las estructuras de datos que tienen muchas variantes ligeramente diferentes. Por ejemplo, si está modelando estructuras de órdenes comerciales para diferentes casos comerciales y variantes de productos, y diferentes variantes requieren diferentes combinaciones de los mismos atributos, como direcciones, ID de cuentas, información de configuración para los productos, etc.

Por lo tanto, tiene muchas estructuras frijoles similares que contienen diferentes subconjuntos de una serie de atributos.Si no desea escribir código para cada variante individual, puede introducir una interfaz Java que tenga todos los atributos que ocurren en estos beans, y usar java.lang.reflect.Proxy para construir instancias de proxy para el bean que desea asignar, y que devuelve null para getters el bean real no tiene/arroja una excepción si se llama a un setter no existente en el bean real. En cierto modo, se inyecta una interfaz en los beans que tiene más métodos que el propio bean.

1

Transmorph, EZMorph, Dozer, OTOM son algunos de ellos que puede consultar para el mapeo de Bean to Bean. He usado Dozer en el pasado y siento que ha crecido bastante estable durante años.

5

ModelMapper es la biblioteca que cumple con todos sus criterios. Ofrece una API de mapeo que usa el código real para mapear propiedades, para que puedas completar el código. Y ofrece validación para garantizar que se mapeen todas las propiedades de destino. Además, ofrece algunas cosas que ni siquiera sabía que quería como el mapeo inteligente :)

mirar la página del ModelMapper para más información:

http://modelmapper.org

2

Otra alternativa es MapStruct que genera código de correspondencia en tiempo de compilación, lo que resulta en asignaciones de tipo seguro que no requieren ninguna dependencia en tiempo de ejecución (Descargo de responsabilidad: soy el autor de MapStruct).

1

Eche un vistazo a GeDA que usa código de bytes para crear clases de mapeo durante el tiempo de ejecución, lo que lo hace extremadamente rápido http://genericdtoassembler.org/. Cubriría el punto 1-3. En cuanto al punto 4, me imagino que es algo IDE, así que no creo que encuentres ninguna biblioteca que lo facilite a menos que tenga complementos IDE.

Cuestiones relacionadas