when metodo implementar como and java jaxb xjc jaxb2-basics

metodo - override hashcode java



Agregue toString, hashCode, equal al generar clases JAXB en Java (2)

Intento generar clases JAXB desde un archivo XSD programáticamente, usando Java. He usado el siguiente fragmento de código para lograr eso:

.... import java.io.File; import java.io.IOException; import org.xml.sax.InputSource; import com.sun.codemodel.JCodeModel; import com.sun.tools.xjc.api.S2JJAXBModel; import com.sun.tools.xjc.api.SchemaCompiler; import com.sun.tools.xjc.api.XJC; .... .... public static void generateJaxb(String schemaPath, String outputDirectory, String packageName) throws DataLoadingException { try { // Setup schema compiler SchemaCompiler sc = XJC.createSchemaCompiler(); sc.forcePackageName(packageName); // Setup SAX InputSource File schemaFile = new File(schemaPath); InputSource is = new InputSource(schemaFile.toURI().toString()); // Parse & build sc.parseSchema(is); S2JJAXBModel model = sc.bind(); JCodeModel jCodeModel = model.generateCode(null, null); jCodeModel.build(new File(outputDirectory)); } catch (IOException exec) { LOGGER.error("Error while generating JAXB classes: " + exec); } }

Las clases generadas contienen solo los métodos getter para los campos. Pero, también quiero incluir los hashCode , equals y setter . ¿Cómo hacer eso mientras generas el código?


En el sitio web Java.net, encontrará el proyecto JAXB 2.x Commons , que proporciona un conjunto común de complementos de utilidad JAXB , incluidos 4 que deberían abordar lo que está tratando de lograr:

  1. Igual Plugin
  2. Plugin HashCode
  3. Setters Plugin
  4. Complemento ToString

Hay otros complementos disponibles que cubren aspectos comunes similares de objetos de dominio Java .

Configuración

Desde una perspectiva de configuración de XML Schema , agregará referencias como se muestra aquí:

<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:basic="http://jaxb2-commons.dev.java.net/basic" xmlns:equals="http://jaxb2-commons.dev.java.net/basic/equals" xmlns:hashCode="http://jaxb2-commons.dev.java.net/basic/hashCode" xmlns:toString="http://jaxb2-commons.dev.java.net/basic/toString" jaxb:extensionBindingPrefixes="basic equals hashCode toString"> <!-- ... --> </xs:schema>

Hay opciones adicionales disponibles, como la definición de propiedades de objeto que deben ignorarse al generar una implementación equals( that ) , una implementación de toString() , etc.

Generación de código Java

Desde una perspectiva de Java , los complementos generalmente tienen las clases generadas implementan una interface ; como ejemplo, las clases generadas que incluyen una implementación equals( that ) implementarán la interfaz Equals .

El enfoque de diseño utilizado por los complementos generalmente genera 2 sabores de implementación:

  1. Una implementación simple / estándar, como el método equals( that ) (cuando se utiliza el Equals Plugin ).
  2. Una implementación más compleja que incluye parámetros de locator y strategy , lo que le permite implementar un manejo personalizado (si lo desea). Para estos, verá una firma de método tal como: equals( thisLocator, thatLocator, that, strategy) .

Build / Runtime

Desde la perspectiva del tiempo de ejecución, debe incluir el jarro de tiempo de ejecución básico de JAXB2 y proporcionar parámetros de opciones tales como: -Xequals , -XhashCode o -XtoString . Se proporcionan ejemplos para utilizar los conceptos básicos de JAXB2 de Ant y Maven , si está utilizando alguno de ellos para realizar construcciones y se proporcionan más detalles relacionados con la construcción en la Guía básica del usuario de JAXB2 .


Actualizar La respuesta a continuación es incorrecta. La interfaz me indujo a error, generateCode realmente no hace nada con los complementos en este momento. Como señaló @Sidola, debería usar SchemaCompiler en SchemaCompiler lugar.

Además de la respuesta de @SenseMickey abordaré la generación de código.

  • Agregue JAR JAXB2-Basics a su ruta de clase.
  • Crear una instancia
    • org.jvnet.jaxb2_commons.plugin.tostring.ToStringPlugin
    • org.jvnet.jaxb2_commons.plugin.equals.EqualsPlugin
    • org.jvnet.jaxb2_commons.plugin.hashcode.HashCodePlugin
    • org.jvnet.jaxb2_commons.plugin.setters.SettersPlugin
  • ... o lo que sea que necesites
  • Pase los complementos a model.generateCode(plugins errorListener) como el primer parámetro.

Por cierto, ¿por qué quieres generar código programáticamente?