Вопрос по schema, xml, xjc, bind, jaxb – Отображение JAXB xjc на существующие доменные объекты

10

Я много занимался поиском и не могу найти краткий пример того, как сопоставить схему XML с существующими объектами домена вместо создания совершенно новых с использованиемxjc, Я создал файл bindings (xjb), но все еще не могу найти способ сделать это.

Если у меня есть существующий объект домена, который я хочу использовать в JAXB, например:

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

И у меня есть схема XML, как показано ниже:

<code><?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>
</code>

Если я пойду генерировать классы JAXB сxjc это создаст новый класс под названиемCustomer (который я хочу). Это также создаст новый класс с именемCustomerOffice (что я не хочу, я хочу, чтобы он использовал мой существующий объект домена).

Поэтому вместо схемы, указывающей на & quot; тип: www: CustomerOffice & quot; Я хотел бы использовать существующиеcom.blah.domain.CustomerOffice.

Я попытался сделать это как можно более простым примером, любая помощь приветствуется.

Ваш Ответ

1   ответ
13

чтобы настроить XJC на то, что вы хотите.

<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
Это сработало отлично! Большое спасибо, надеюсь, это поможет другим людям, которые боролись с этим. colbyjax
ComplexType внутри xsd все еще должен быть определен или его можно удалить? В моем случае, когда я удаляю его, я получаю сообщение о том, что на тип нельзя ссылаться. Я еще не полностью понимаю механику, стоящую за этим, хотя, но я предполагаю, что связывание предотвращает создание класса? :)

Похожие вопросы