How to generate JAXB classes with xjc
JAXB
xjc
classes
java
JAXB is part of the JDK, it is one of the most often used frameworks to process XML documents. Implementing all binding classes for an existing XML interface can be time-consuming. To generate the binding classes there is a command line tool xjc
provided by the JDK.
To see all the options just type xjc
in the console. It will print the following:
Usage: xjc [-options ...] <schema file/URL/dir/jar> ... [-b <bindinfo>] ...
If dir is specified, all schema files in it will be compiled.
If jar is specified, /META-INF/sun-jaxb.episode binding file will be compiled.
Options:
-nv : do not perform strict validation of the input schema(s)
-extension : allow vendor extensions - do not strictly follow the
Compatibility Rules and App E.2 from the JAXB Spec
-b <file/dir> : specify external bindings files (each <file> must have its own -b)
If a directory is given, **/*.xjb is searched
-d <dir> : generated files will go into this directory
-p <pkg> : specifies the target package
-httpproxy <proxy> : set HTTP/HTTPS proxy. Format is [user[:password]@]proxyHost:proxyPort
-httpproxyfile <f> : Works like -httpproxy but takes the argument in a file to protect password
-classpath <arg> : specify where to find user class files
-catalog <file> : specify catalog files to resolve external entity references
support TR9401, XCatalog, and OASIS XML Catalog format.
-readOnly : generated files will be in read-only mode
-npa : suppress generation of package level annotations (**/package-info.java)
-no-header : suppress generation of a file header with timestamp
-target (2.0|2.1) : behave like XJC 2.0 or 2.1 and generate code that doesnt use any 2.2 features.
-encoding <encoding> : specify character encoding for generated source files
-enableIntrospection : enable correct generation of Boolean getters/setters to enable Bean Introspection apis
-disableXmlSecurity : disables XML security features when parsing XML documents
-contentForWildcard : generates content property for types with multiple xs:any derived elements
-xmlschema : treat input as W3C XML Schema (default)
-relaxng : treat input as RELAX NG (experimental,unsupported)
-relaxng-compact : treat input as RELAX NG compact syntax (experimental,unsupported)
-dtd : treat input as XML DTD (experimental,unsupported)
-wsdl : treat input as WSDL and compile schemas inside it (experimental,unsupported)
-verbose : be extra verbose
-quiet : suppress compiler output
-help : display this help message
-version : display version information
-fullversion : display full version information
Extensions:
-Xinject-code : inject specified Java code fragments into the generated code
-Xlocator : enable source location support for generated code
-Xsync-methods : generate accessor methods with the 'synchronized' keyword
-mark-generated : mark the generated code as @javax.annotation.Generated
-episode <FILE> : generate the episode file for separate compilation
-Xpropertyaccessors : Use XmlAccessType PROPERTY instead of FIELD for generated classes
Note: make sure the JDK bin folder it is in the path.
Example
Let's have an example. We will use the following simple XSD schema definition and xjc
to generate the corresponding classes User and Address with the described properties and required JAXB annotations.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="user" type="user" />
<xs:element name="address" type="address" />
<xs:complexType name="user">
<xs:sequence>
<xs:element name="firstName" type="xs:string" minOccurs="0" />
<xs:element name="lastName" type="xs:string" minOccurs="0" />
<xs:element name="email" type="xs:string" minOccurs="1" />
<xs:element name="password" type="xs:string" minOccurs="0" />
<xs:element ref="address" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="address">
<xs:sequence>
<xs:element name="line1" type="xs:string" minOccurs="1" />
<xs:element name="line2" type="xs:string" minOccurs="0" />
<xs:element name="city" type="xs:string" minOccurs="0" />
<xs:element name="county" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Command line
# xjc -d src -p com.admfactory.client schema.xsd
The output is:
parsing a schema...
compiling a schema...
com\admfactory\client\Address.java
com\admfactory\client\ObjectFactory.java
com\admfactory\client\User.java
Generated classes
User
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2017.11.30 at 10:31:27 AM GMT
//
package com.admfactory.client;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for user complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="user">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="firstName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="lastName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="email" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="password" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element ref="{}address"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "user", propOrder = {
"firstName",
"lastName",
"email",
"password",
"address"
})
public class User {
protected String firstName;
protected String lastName;
@XmlElement(required = true)
protected String email;
protected String password;
@XmlElement(required = true)
protected Address address;
/**
* Gets the value of the firstName property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getFirstName() {
return firstName;
}
/**
* Sets the value of the firstName property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setFirstName(String value) {
this.firstName = value;
}
/**
* Gets the value of the lastName property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getLastName() {
return lastName;
}
/**
* Sets the value of the lastName property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setLastName(String value) {
this.lastName = value;
}
/**
* Gets the value of the email property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getEmail() {
return email;
}
/**
* Sets the value of the email property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setEmail(String value) {
this.email = value;
}
/**
* Gets the value of the password property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getPassword() {
return password;
}
/**
* Sets the value of the password property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setPassword(String value) {
this.password = value;
}
/**
* Gets the value of the address property.
*
* @return
* possible object is
* {@link Address }
*
*/
public Address getAddress() {
return address;
}
/**
* Sets the value of the address property.
*
* @param value
* allowed object is
* {@link Address }
*
*/
public void setAddress(Address value) {
this.address = value;
}
}
Address
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2017.11.30 at 10:31:27 AM GMT
//
package com.admfactory.client;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for address complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="address">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="line1" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="line2" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="city" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="county" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "address", propOrder = {
"line1",
"line2",
"city",
"county"
})
public class Address {
@XmlElement(required = true)
protected String line1;
protected String line2;
protected String city;
protected String county;
/**
* Gets the value of the line1 property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getLine1() {
return line1;
}
/**
* Sets the value of the line1 property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setLine1(String value) {
this.line1 = value;
}
/**
* Gets the value of the line2 property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getLine2() {
return line2;
}
/**
* Sets the value of the line2 property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setLine2(String value) {
this.line2 = value;
}
/**
* Gets the value of the city property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getCity() {
return city;
}
/**
* Sets the value of the city property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setCity(String value) {
this.city = value;
}
/**
* Gets the value of the county property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getCounty() {
return county;
}
/**
* Sets the value of the county property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setCounty(String value) {
this.county = value;
}
}
ObjectFactory
ObjectFactory it contains factory methods for each generated class or interface. This can be really useful if you need to create JAXBElement representations of your objects.
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2017.11.30 at 10:31:27 AM GMT
//
package com.admfactory.client;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;
/**
* This object contains factory methods for each
* Java content interface and Java element interface
* generated in the com.admfactory.client package.
* <p>An ObjectFactory allows you to programatically
* construct new instances of the Java representation
* for XML content. The Java representation of XML
* content can consist of schema derived interfaces
* and classes representing the binding of schema
* type definitions, element declarations and model
* groups. Factory methods for each of these are
* provided in this class.
*
*/
@XmlRegistry
public class ObjectFactory {
private final static QName _Address_QNAME = new QName("", "address");
private final static QName _User_QNAME = new QName("", "user");
/**
* Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.admfactory.client
*
*/
public ObjectFactory() {
}
/**
* Create an instance of {@link Address }
*
*/
public Address createAddress() {
return new Address();
}
/**
* Create an instance of {@link User }
*
*/
public User createUser() {
return new User();
}
/**
* Create an instance of {@link JAXBElement }{@code <}{@link Address }{@code >}}
*
*/
@XmlElementDecl(namespace = "", name = "address")
public JAXBElement<Address> createAddress(Address value) {
return new JAXBElement<Address>(_Address_QNAME, Address.class, null, value);
}
/**
* Create an instance of {@link JAXBElement }{@code <}{@link User }{@code >}}
*
*/
@XmlElementDecl(namespace = "", name = "user")
public JAXBElement<User> createUser(User value) {
return new JAXBElement<User>(_User_QNAME, User.class, null, value);
}
}