Обходной путь JAXB для импорта Chameleon XSD? - PullRequest
8 голосов
/ 20 октября 2010

это мой первый вопрос, поэтому, пожалуйста, будьте осторожны;)

Я застрял со странной проблемой.По сути, я получаю три определения XSD, например, следующее:

PartA.xsd
targetNameSpace="PartA"
include="PartB.xsd"

PartB.xsd
<!-- no namespace definition!!! -->

PartC.xsd
targetNameSpace="PartC"
inlude="PartB.xsd"
import="PartA.xsd"

Ошибка появляется при связывании PartC через JAXB с классами Java:

  • Класс/ интерфейс с тем же именем "b.exampleType" уже используется.Используйте настройку класса для разрешения этого конфликта.
  • Эта запутанная ошибка произошла, скорее всего, потому, что схема использует технику, называемую «схема хамелеона», которая заставляет одно определение загружаться несколько раз в разные пространства имен.Подробнее об этом см. http://forums.java.net/jive/thread.jspa?threadID=18631.

По ссылке, как я выяснил, действительная ошибка находится в PartB, у которой нет объявления пространства имен!Этот метод называется Схема хамелеона .Определенные типы в PartB примут пространство имен импортирующего XSD .

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

  1. "PartA"
  2. "PartC"

И это когда JAXB ломается.Я не нашел способа правильно связать PartC .И (чтобы все было сложнее) у меня есть шанс изменить исходные определения XSD!

Кто-нибудь сталкивался с этим явлением или чем-то подобным раньше и имеет ли подходящий для этого обходной путь?

Ответы [ 3 ]

4 голосов
/ 21 мая 2015

Я столкнулся с той же проблемой, используя wsdl2java :

WSDLToJava Ошибка: выбрасывается JAXB: класс / интерфейс с тем же Название "Respuesta" уже используется. Используйте настройку класса для разрешить этот конфликт.

Но этот вопрос указал мне правильное направление. Используя wsdl2java из CFX, вы можете настроить привязку элементов к классам с помощью файла binding.xml. Например:

/Applications/apache-cxf-2.7.13/bin/wsdl2java -b ./src/main/resources/binding.xml -V -d src/main/java -compile -classdir target/classes  http://someurl.wsdl

Ключ в объяснении в файле binding.xml заключается в том, чтобы назвать определенный элемент xsd одним конкретным className, чтобы избежать коллизий:

<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="./someXsdFile.xsd">
    <!-- Rename the respuesta class to resolve a naming conflict with other Respuesta element already defined-->
    <jxb:bindings node="//xs:element[@name='respuesta']/xs:complexType">
      <jxb:class name="Respuesta2" />
    </jxb:bindings>
  </jxb:bindings>
</jxb:bindings>

Надеюсь, что это поможет следующему человеку с этой проблемой, используя wsdl2java. Я полагаю, что другие инструменты должны позволять подобные подходы к этой проблеме.

1 голос
/ 20 октября 2010

Доступно следующее, хотя оно не дает много деталей:

0 голосов
/ 21 февраля 2013

У меня возникла та же проблема, и поиск в Google привел меня сюда.Ваш вопрос достаточно подробен, и я смог найти ответ. Я поместил пространство имен в PartB.xsd и использовал XJC для генерации классов Java.Я добавил следующее:

xmlns: ns = "http://www.myCompany.com/2009/01/CustSchema" targetNamespace =" http://www.myCompany.com/2009/01/CustSchema"

...