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:

  1. Equals Plugin
  2. HashCode Plugin
  3. Setters Plugin
  4. 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:

  1. A simple/standard implementation, such as an equals( that ) method (when using the Equals Plugin).
  2. A more complex implementation that includes locator and strategy 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:

  1. Add in pom.xml <dependencies>
<dependency> 
    <groupId>org.jvnet.jaxb2_commons</groupId>
    <artifactId>jaxb2-basics</artifactId>
    <version>0.11.1</version>
</dependency>
  1. 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?