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:
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:
- Una implementación simple / estándar, como el método
equals( that )
(cuando se utiliza elEquals Plugin
). - Una implementación más compleja que incluye parámetros de
locator
ystrategy
, 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?