Add toString, hashCode, equals while generating JAXB classes in Java
On the GitHub website, you will find the JAXB2 Basics project, which provides a common set of JAXB
utility plugins, including 4 that should address what you are trying to achieve:
- Equals Plugin
- HashCode Plugin
- Setters Plugin
- ToString Plugin
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][6] 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.
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>
After mvn clean install
the generated class will be like:
package my.package
public class MyClass implements Equals2, HashCode2, ToString2 {
}
Soure: https://github.com/highsource/jaxb2-basics/wiki/Using-JAXB2-Basics-Plugins
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?