Pregunta

Con código fuente de Java generado, como

  • Código generado con herramientas de hibernación
  • Código generado con Jaxb Schema Binding (XJC)
  • Código generado con WDSL2Java (CXF)

Todas las clases generadas son tipos de "objetos de valor", sin lógica de negocios. Y si agrego métodos al código fuente generado, perderé estos métodos si repito la generación del código fuente.

¿Estas herramientas de generación de código Java ofrecen formas de "extender" el código generado?

Por ejemplo,

  • para anular el método ToString (para registrar)
  • para implementar el patrón de visitante (para análisis / validación de datos)
¿Fue útil?

Solución

Para Jaxb, ver Agregar comportamientos.

Básicamente, configura Jaxb para devolver una instancia personalizada del objeto que normalmente esperaría. En el siguiente ejemplo, crea un nuevo objeto Personex que extiende a la persona del objeto JAXB. Este mecanismo funciona bien en el sentido de que está derivando de las clases generadas y no alterando las clases o esquemas JAXB en absoluto.

package org.acme.foo.impl;

class PersonEx extends Person {
  @Override
  public void setName(String name) {
    if(name.length()<3) throw new IllegalArgumentException();
    super.setName(name);
  }
}

@XmlRegistry
class ObjectFactoryEx extends ObjectFactory {
  @Override
  Person createPerson() {
    return new PersonEx();
  }
}

Tenga en cuenta que la directiva @Override es importante en caso de que su objeto JAXB cambie: evitará que su personalización se convierta huérfano.

Otros consejos

En cuanto a Hibernate, puede ajustar los archivos de plantilla utilizados en la generación de código para cambiar su comportamiento. Si desea ajustar las herramientas Hibernate que puede editar, por ejemplo: dao/daohome.ftl

Incluso puede agregar campos a la salida "toString ()" editando el .hbm.xml archivos

...
<property name="note" type="string">
    <meta attribute="use-in-tostring">true</meta>
    <column name="note" />
</property>
...

Tanto para el registro como para la validación que puede considerar usar Aop con aspectoJ (No recomiendo jugar con el código generado, ya que es posible que desee construirlo desde cero muchas veces).

Primero, reiteraría que la modificación del código generado tiene muchos problemas asociados con él y que, cuando sea posible, debe evitarse. Dicho esto, a veces esto no es práctico para evitar o más esfuerzo que solo lidiar con los cambios cuando se regenera el código.

Lamentablemente, Java no apoya el concepto de clases parciales que tiene C#. Estos son precisamente para resolver este tipo de problema.

Debe ver si sus herramientas de generación de código admiten alguna forma de comentarios significativos que delimitan las regiones agregadas por usted mismo en la clase (esto es poco probable y no ayudará si está modificando el código en lugar de agregarlo)

Su mejor opción si realmente desea hacer esto es generar los archivos inicialmente, pero verifíquelos en un repositorio de control de versiones de inmediato. Luego haga sus cambios, verifique eso.

La próxima vez que vuelva a ejecutar las herramientas y permita que sobrescriban los archivos existentes, puede diferir con sus fuente controlados y fusionar los cambios (la mayoría de los cambios triviales como la adición de nuevas columnas/tablas serán poco esfuerzo.

Esto no lo ayudará tanto si el generador de código genera repentinamente un código radicalmente diferente (digamos una nueva versión), pero en aquellos casos cualquier código que agregó que no era simplemente métodos de conveniencia adicionales que dependen de datos/métodos ya expuestos públicamente) tendrán problemas No importa cómo se mezcle con la clase. Sin embargo, el sistema de control de versiones todavía ayuda, ya que también registra los cambios originales Entonces, puede ver lo que había agregado anteriormente y lo que, uno supondría, debe recrear en el nuevo estilo.

No es una buena idea editar archivos de código generados, ya sea editando los archivos que sean o subclase. Hagas lo que hagas, asegúrate de dejar la firma creada por la herramienta intacta, para que sea posible entender en el futuro que el archivo se generó automáticamente.

Le recomiendo que investigue las opciones de comando de las herramientas para ver si le permiten cierta flexibilidad. Algunas herramientas pueden generar clases o interfaces abstractas en lugar de clases concretas. Si esto no es posible, cree un objeto de dominio que incluya el objeto autogenerado como una variable miembro.

La forma en que he usado Hibernate es generar clases base que luego extiendo. Agrego toda mi lógica de negocios (si la hay) a estas subclases. Muy a menudo, también termino cambiando las plantillas de marca freem utilizada por Hibernate para personalizar aún más las clases generadas.

La cita de AOP es buena. Agregaré Spring, que tiene funciones AOP muy bonitas integradas.

Mira esto

http://code.google.com/p/jaxb-method-inserter/

Es un pequeño complemento para Jaxb que escribí, es bastante simple de usar. Espero que ayude

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top