tool pom plugin generate from example java hibernate code-generation jaxb cxf

pom - ¿Cómo puedo extender el código Java generado por las herramientas JAXB, CXF o Hibernate?



generate client from wsdl java cxf (7)

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

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

... <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, puede considerar el uso de AOP con AspectJ (no recomiendo jugar con el código generado, ya que es posible que desee compilarlo desde cero muchas veces).

Con el código fuente generado de Java, como

  • código generado con las herramientas de Hibernate
  • código generado con el enlace de esquema de JAXB (xjc)
  • código generado con WDSL2Java (cxf)

todas las clases generadas son tipos de "objetos de valor", sin lógica comercial. 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 "ampliar" el código generado?

Por ejemplo,

  • para anular el método ToString (para el registro)
  • para implementar el patrón de visitante (para el análisis / validación de datos)

La cita de AOP es buena. Agregaré Spring, que tiene muy buenas características AOP integradas.


La forma en que he usado Hibernate es generar clases base que luego extiendo. Agrego toda mi lógica comercial (si corresponde) a estas subclases. Con bastante frecuencia también termino cambiando las plantillas de FreeMarker utilizadas por Hibernate para personalizar aún más las clases generadas.


No es una buena idea editar los archivos de códigos generados, editando los archivos ellos mismos o subclasificando. Hagas lo que hagas, asegúrate de dejar la firma creada por la herramienta intacta, de modo que sea posible comprender en el futuro que el archivo se generó automáticamente.

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


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

Tristemente Java no admite el concepto de clases parciales que tiene c #. Estos son precisamente para resolver este tipo de problema.

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

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

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

Esto no te ayudará si el generador de código genera código radicalmente diferente (digamos una nueva versión) pero en esos casos cualquier código que hayas agregado que no sea simplemente métodos de conveniencia adicionales basados ​​en datos / métodos ya expuestos públicamente tendrá problemas no importa cómo se mezcle en la clase. Sin embargo, el sistema de control de versiones todavía ayuda, ya que también registra los cambios originales para que pueda ver lo que había agregado previamente y lo que uno supondría que necesita recrear en el nuevo estilo.



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 el objeto JAXB Person. Este mecanismo funciona bien porque deriva de las clases generadas y no altera las clases o esquemas de JAXB.

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, ya que evitará que su personalización quede huérfana .