I'm trying to generate JAXB classes from an XSD file programmatically, using Java. I've used the following code snippet to achieve that:
....
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);
}
}
The generated classes contain only the getter
methods for the fields. But, I want to include the hashCode
, equals
and setter
methods as well. How to do that while generating the code?
On the Java.net website, you will find the JAXB 2.x Commons project, which provides a common set of JAXB
utility plugins, including 4 that should address what you are trying to achieve:
There are other plugins available that cover similar common aspects of Java
domain objects.
Configuration
From an XML Schema
configuration perspective, you will add references as shown here:
<?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>
There are additional options available, such as defining object properties that should be ignored when generating an equals( that )
implementation, a toString()
implementation, etc.
Java Code Generation
From a Java
perspective, the plugins generally have the generated classes implement an interface
; as an example, generated classes that include an equals( that )
implementation will implement the Equals interface.
The design approach used by the plugins usually generates 2 flavors of implementation:
- A simple/standard implementation, such as an
equals( that )
method (when using theEquals Plugin
). - A more complex implementation that includes
locator
andstrategy
parameters, which allows you to implement custom handling (if you wish). For these, you will see a method signature such as:equals( thisLocator, thatLocator, that, strategy)
.
Build/Runtime
From a runtime perspective, you must include the JAXB2 Basics Runtime jar and provide option parameters such as: -Xequals
, -XhashCode
, or -XtoString
. There are examples provided for using the JAXB2 Basics from Ant
and Maven
, if you are using either of those to perform builds and more build-related details are provided in the JAXB2 Basics User Guide.
Update The answer below is incorrect. I was mislead by the interface, generateCode
really does not do anything with plugins at the moment. As @Sidola pointed out, you should use SchemaCompiler
instead.
In addition to @SeanMickey's answer I'll address code generation.
- Add JAXB2-Basics JARs to your class path.
- Instantiate
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
- ...or whatever you need.
- Pass plugins to
model.generateCode(plugins errorListener)
as the first parameter.
By the way, why do you want to generate code programmatically?
For me the simplest way to do is using JAXB2 Basics Plugins:
- Add in pom.xml
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.11.1</version>
</dependency>
- Add the plugin
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>src/main/resources</schemaDirectory>
<generateDirectory>target/generated-sources</generateDirectory>
<generatePackage>my.package</generatePackage>
</configuration>
</execution>
</executions>
<configuration>
<extension>true</extension>
<args>
<arg>-XtoString</arg>
<arg>-Xequals</arg>
<arg>-XhashCode</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.11.1</version>
</plugin>
</plugins>
</configuration>
</plugin>
Soure: https://github.com/highsource/jaxb2-basics/wiki/Using-JAXB2-Basics-Plugins
来源:https://stackoverflow.com/questions/32334372/add-tostring-hashcode-equals-while-generating-jaxb-classes-in-java