Ошибка JAXB, примеры документов xsd - PullRequest
1 голос
/ 22 февраля 2011

Я получаю ошибки JAXB при запуске "xjc -p foo.bar bmw.xsd":

[ОШИБКА] Класс / интерфейс с таким же именем "foo.bar.Fault" уже используется. линия 16 bmw.xsd

[ОШИБКА] (относится к вышеуказанной ошибке), здесь генерируется еще одна ошибка. строка 26 abc.xsd

Это связано с конфликтом двух элементов «неисправности»? Если так, что я должен сделать, чтобы исправить?

bmw.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"  elementFormDefault="qualified"    targetNamespace="http://foo.com/bmw" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bmw="http://foo.com/bmw">
<xs:import namespace="http://schemas.xmlsoap.org/soap/envelope/"  schemaLocation="abc.xsd"/>
<xs:element name="rule">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="bmw:customer"/>
    <xs:element ref="bmw:schemaName"/>
    <xs:element ref="bmw:schemaVersion"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="customer" type="xs:integer"/>
<xs:element name="schemaName" type="xs:NCName"/>
<xs:element name="schemaVersion" type="xs:decimal"/>
<xs:element name="fault">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="bmw:faultcode"/>
    <xs:element ref="bmw:faultstring"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="faultcode" type="xs:integer"/>
<xs:element name="faultstring" type="xs:string"/>
</xs:schema>

abc.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://schemas.xmlsoap.org/soap/envelope/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bmw="http://foo.com/bbs">
<xs:import namespace="http://foo.com/bmw" schemaLocation="bmw.xsd"/>
<xs:element name="Envelope">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="env:Header"/>
    <xs:element ref="env:Body"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Header">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="bmw:rule"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Body">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="env:Fault"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Fault">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="bmw:fault"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

У вас есть несколько вариантов разрешения конфликта имен.

Вариант № 1 - Аннотация схемы

Вы можете аннотировать схему XML для разрешения конфликта имен:

<xs:element name="Fault">
    <xs:annotation>
        <xs:appinfo>
            <jaxb:class name="Fault2" />
        </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="bmw:fault"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

abc.xsd

См. Аннотацию схемы для элемента «Неисправность».

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified" targetNamespace="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bmw="http://foo.com/bbs"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1">
    <xs:import namespace="http://foo.com/bmw" schemaLocation="bmw.xsd" />
    <xs:element name="Envelope">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="env:Header" />
                <xs:element ref="env:Body" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Header">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="bmw:rule"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Body">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="env:Fault" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Fault">
        <xs:annotation>
            <xs:appinfo>
                <jaxb:class name="Fault2" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="bmw:fault"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Опция № 2 - Файл внешних привязок

Вместо изменения схемы XML вы также можете использовать файл внешних привязок:

bindings.xml

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

    <jaxb:bindings schemaLocation="abc.xsd">
            <jaxb:bindings node="//xs:element[@name='Fault']">
                <jaxb:class name="Fault2"/>
            </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>

Команда xjc будет:

xjc -d out -b bindings.xml abc.xsd
<Ч />

Название пакета

Для управления именем пакета вы можете передать его в качестве параметра команде XJC:

xjc -d out -b bindings.xml -p com.foo.bar abc.xsd

Или исправьте файл привязок.

0 голосов
/ 22 февраля 2011

Да, ваша ошибка связана с конфликтом. Это можно исправить с помощью настраиваемой привязки . Настраиваемая привязка - это способ сказать JAXB сделать что-то другое, чем то, что она, естественно, сделала бы. Попробуйте заглянуть в тег class во внешнем файле привязки, если вы не можете самостоятельно комментировать XSD.

...