10

I have done a lot of searching and cannot find a concise example of how to map an XML schema to existing domain objects instead of creating brand new ones utilizing xjc. I have created a bindings (xjb) file but still can find no way of accomplishing this.

If I have an existing domain Object that I want JAXB to use such as the following:

package com.blah.domain;
class CustomerOffice{
   private int id;
   private String name;
   private String phone;
}

And I have an XML Schema like the following:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:www="http://www.blah.com" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.blah.com" elementFormDefault="unqualified">
   <xs:element name="Customer">
      <xs:complexType>
         <xs:sequence>
           <xs:element name="id" type="xs:int" nillable="false" minOccurs="1" maxOccurs="1"/>
           <xs:element name="name" type="xs:string"/>
           <xs:element name="city" type="xs:string"/>
           <xs:element name="CustomerOffice" type="www:CustomerOffice" maxOccurs="unbounded"/>
        </xs:sequence>
     </xs:complexType>
   </xs:element>
   <xs:complexType name="CustomerOffice">
      <xs:sequence>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="length" type="xs:int"/>
      </xs:sequence>
   </xs:complexType>
</xs:schema>

If I go to generate the JAXB classes with xjc it will create a new class called Customer (which I want). It will also create a new class called CustomerOffice (which I don't want, I want it to use my existing domain object).

So instead of the schema pointing to "type:www:CustomerOffice" I would want it to use the existing com.blah.domain.CustomerOffice.

I tried to make this as simple an example as possible, any help is appreciated.

informatik01
  • 15,174
  • 9
  • 67
  • 100
colbyjax
  • 123
  • 1
  • 8

1 Answers1

14

You can use an external binding file to configure XJC to do what you want.

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jxb:bindings schemaLocation="yourSchema.xsd">
        <jxb:bindings node="//xs:complexType[@name='CustomerOffice']">
            <jxb:class ref="com.blah.domain.CustomerOffice"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

XJC Call

xjc -d outputDir -b binding.xml yourSchema.xsd
bdoughan
  • 142,244
  • 22
  • 280
  • 377
  • 2
    That worked perfect! Thank you so much, hopefully this will help some other people that have struggled with this. – colbyjax May 02 '12 at 20:11
  • Does the complexType inside the xsd still have to be defined or can it be removed? In my case, when I remove it, I get an error stating that the type cannot be referenced. I don't fully understand the mechanics behind it yet though but I would guess that the binding prevents the creation of the class? :) – motaa Aug 22 '18 at 07:40