Generating a JAXB class that implements an interface Generating a JAXB class that implements an interface java java

Generating a JAXB class that implements an interface


Unfortunately, it looks like the interface-injection plugin mentioned in some of the other answers is no longer well-supported. In fact, I'm having trouble finding the JAR for download.

Thankfully, the JAXB2 Basics Plugins provides a similar mechanism for adding an interface to the generated JAXB stubs (see the Inheritance plugin).

The Inheritance plugin documentation has an example showing what the XML schema file might look like. However, since you cannot modify the schema, you can use an external bindings file instead:

<?xml version="1.0"?><jxb:bindings version="1.0"   xmlns:jxb="http://java.sun.com/xml/ns/jaxb"   xmlns:xs="http://www.w3.org/2001/XMLSchema"   xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"  xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"  jxb:extensionBindingPrefixes="xjc">    <jxb:bindings schemaLocation="xsd/adult.xsd">      <jxb:bindings node="//xs:complexType[@name='Person']">        <inheritance:implements>mypackage.Hello</inheritance:implements>       </jxb:bindings>    </jxb:bindings></jxb:bindings>

The JAXB2 Basics Plugins documentation includes instructions for using the plugin with Ant and Maven. You can also use it straight from the command line, but the command is a bit messy (due to the number of jars you have to add to the classpath):

java -jar jaxb-xjc.jar      -classpath jaxb2-basics-0.5.3.jar,jaxb2-basics-runtime-0.5.3.jar,                jaxb2-basics-tools-0.5.3.jar,commons-beanutils-0.5.3.jar,                commons-lang.jar,commons-logging.jar     -p mypackage.myxml -extension -Xinheritance xsd/adult.xsd -b binding.xjb

The JAXB2 Basics Plugins provides a number of other utilities which you might also find useful (such as autogeneration of equals, hashCode, and toString methods).


It might be overkill for your situation, but I have done this using AspectJ (we were already using aspects on that project so we already had the dependency and the exposure).

You'd declare an aspect along the lines of:

public aspect MyAspect{    declare parents:         com.foo.generated.Adult    implements com.foo.Person;    declare parents:         com.foo.generated.Kid    implements com.foo.Person;}

Which will add the interface com.foo.Person to the classes com.foo.generated.Adult and com.foo.generated.Kid

Might be overkill for your purpose, but it worked for us.


The answer that worked for me was Jim Hurne's example of using the JAXB2 Basics plugin. But the documentation he linked appears to be no longer available so for reference, this is how I configured the maven plugin:

        <plugin>            <groupId>org.jvnet.jaxb2.maven2</groupId>            <artifactId>maven-jaxb2-plugin</artifactId>            <version>0.8.2</version>            <executions>                <execution>                    <goals>                        <goal>generate</goal>                    </goals>                    </execution>            </executions>            <configuration>                <extension>true</extension>                <args>                    <arg>-Xinheritance</arg>                </args>                <bindingDirectory>src/main/resources/xjb</bindingDirectory>                <bindingIncludes>                    <include>**.xml</include> <!-- This Should reference the binding files you use to configure the inheritance -->                </bindingIncludes>                <schemaDirectory>src/main/resources/xsd</schemaDirectory>                <generateDirectory>${project.build.directory}/generated-sources/jaxb</generateDirectory>                <generatePackage>mypackage</generatePackage>                <plugins>                    <plugin>                        <groupId>org.jvnet.jaxb2_commons</groupId>                        <artifactId>jaxb2-basics</artifactId>                        <version>0.5.3</version>                    </plugin>                </plugins>            </configuration>        </plugin>