= jaxb = * http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing.html * With JAXB you can: * Generate JAXB Java classes from an XML schema * Use schema-derived JAXB classes to unmarshal and marshal XML content in a Java application * Create a Java content tree from scratch using schema-derived JAXB classes * Validate XML content during unmarshalling and at runtime * Customize JAXB schema-to-Java bindings == XSD data types == * http://docs.oracle.com/javaee/5/tutorial/doc/bnazq.html || '''XSD type''' || '''Java type''' || ||xsd:string || java.lang.String|| ||xsd:integer || java.math.BigInteger|| ||xsd:int || int|| ||xsd.long || long|| ||xsd:short || short|| ||xsd:decimal || java.math.BigDecimal|| ||xsd:float || float|| ||xsd:double || double|| ||xsd:boolean || boolean|| ||xsd:byte || byte|| ||xsd:QName || javax.xml.namespace.QName|| ||xsd:dateTime || javax.xml.datatype.XMLGregorianCalendar|| ||xsd:base64Binary || byte[]|| ||xsd:hexBinary || byte[]|| ||xsd:unsignedInt || long|| ||xsd:unsignedShort || int|| ||xsd:unsignedByte || short|| ||xsd:time || javax.xml.datatype.XMLGregorianCalendar|| ||xsd:date || javax.xml.datatype.XMLGregorianCalendar|| ||xsd:g || javax.xml.datatype.XMLGregorianCalendar|| ||xsd:anySimpleType || java.lang.Object|| ||xsd:anySimpleType || java.lang.String|| ||xsd:duration || javax.xml.datatype.Duration|| ||xsd:NOTATION || javax.xml.namespace.QName|| == xjc command generation example == {{{#!highlight sh cd /tmp mkdir -p xjctest/xsd cd xjctest }}} nano simple.xjb {{{#!highlight xml <jaxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.0"> <jaxb:globalBindings generateValueClass="true"> <xjc:simple /> <xjc:serializable uid="12343"/> <!-- marks generated class as Serializable--> <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" printMethod="javax.xml.bind.DatatypeConverter.printDateTime" /> </jaxb:globalBindings> </jaxb:bindings> }}} '''nano xsd/test.xsd''' {{{#!highlight xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="test" type="Test"/> <xs:complexType name="Test"> <xs:sequence> <xs:element name="name" type="xs:string" minOccurs="0"/> <xs:element name="birthDate" type="xs:dateTime" minOccurs="0"/> <xs:element name="dummyInt" type="xs:int" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:schema> }}} Run command {{{#!highlight sh xjc xsd/test.xsd -b simple.xjb -extension -npa }}} {{{ parsing a schema... compiling a schema... generated/ObjectFactory.java generated/Test.java org/w3/_2001/xmlschema/Adapter1.java }}} To generate a proper Date it might be necessary to use an adapter for xjb. == Generate Java classes with Maven, xjc and XSD == {{{#!highlight sh * mkdir -p /tmp/xjctest/src/main/resources }}} === pom.xml === {{{#!highlight xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.allowed.bitarus</groupId> <artifactId>xjctest</artifactId> <version>0.1.0</version> <build> <plugins> <plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.11.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <schemaDirectory>src/main/resources</schemaDirectory> <schemaIncludes> <include>*.xsd</include> </schemaIncludes> <bindingDirectory>src/main/resources</bindingDirectory> <bindingIncludes> <include>*.xjb</include> </bindingIncludes> </configuration> </plugin> </plugins> </build> </project> }}} * Copy test.xsd and and simple.xjb to /tmp/xjctest/src/main/resources * run mvn clean install * The source code is created in /tmp/xjctest/target/generated-sources/xjc/ == Generate classes with jaxb in Java 17 == Will generate files to src/main/java with package test.org.types.Client from the xsd file. * test/org/types/Client.java * test/org/types/ObjectFactory.java * org/w3/_2001/xmlschema/Adapter1.java {{{#!highlight sh cd ~ wget https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-ri/4.0.2/jaxb-ri-4.0.2.zip yum install unzip unzip jaxb-ri-4.0.2.zip jaxb-ri/bin/xjc.sh mkdir ~/xjctest cd xjctest mkdir -p src/main/resources mkdir -p src/main/java ~/jaxb-ri/bin/xjc.sh src/main/resources/test.xsd -b src/main/resources/simple.xjb -d src/main/java -p org.example -extension -npa }}} === pom.xml === {{{#!highlight xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.allowed.bitarus</groupId> <artifactId>xjctest</artifactId> <version>0.1.0</version> <dependencies> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> </dependencies> </project> }}} === src/main/resources/simple.xjb === {{{#!highlight xml <jaxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc" jaxb:version="3.0"> <jaxb:globalBindings generateValueClass="true"> <xjc:simple /> <xjc:serializable uid="12343"/> <!-- marks generated class as Serializable--> <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" printMethod="javax.xml.bind.DatatypeConverter.printDateTime" /> </jaxb:globalBindings> </jaxb:bindings> }}} === src/main/resources/test.xsd === {{{#!highlight xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://org.test/types" > <xs:complexType name="Client"> <xs:sequence> <xs:element name="name" type="xs:string" minOccurs="0"/> <xs:element name="creationDate" type="xs:dateTime" minOccurs="0"/> <xs:element name="id" type="xs:int" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:schema> }}}