2014-09-17 3 views
1

У меня есть wsdl, который импортирует схему Я пытаюсь разрешить xjc именовать несколько вложенных классов MyElementName с тем же именем, которое не компилируется Я создал этот файл привязки ниже, но он выдает ошибку:Как переименовать вложенные классы в jaxb xjc

parsing a schema... 
compiling a schema... 
Exception in thread "main" java.lang.IllegalArgumentException: Illegal class inheritance loop. 
Outer class MyElementName1 may not subclass from inner class: MyElementName1 
    at com.sun.codemodel.internal.JDefinedClass._extends(JDefinedClass.java:257) 
    at com.sun.tools.internal.xjc.generator.bean.ImplStructureStrategy$1._extends(ImplStructureStrategy.java:104) 
    at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.<init>(BeanGenerator.java:197) 
    at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.generate(BeanGenerator.java:151) 
    at com.sun.tools.internal.xjc.model.Model.generateCode(Model.java:275) 
    at com.sun.tools.internal.xjc.Driver.run(Driver.java:342) 
    at com.sun.tools.internal.xjc.Driver.run(Driver.java:184) 
    at com.sun.tools.internal.xjc.Driver._main(Driver.java:107) 
    at com.sun.tools.internal.xjc.Driver.access$000(Driver.java:64) 
    at com.sun.tools.internal.xjc.Driver$1.run(Driver.java:87) 

II удалить первый обязательный для MyElementName1 он работает правильно, но только имена 1 классов, я хочу изменить оба названия, как изменить привязку файла, так что он будет правильно назовите оба старых вложенных класса на два уникальных имени, которые я выбрал ниже. Я хочу, чтобы это сделать, потому что у меня есть другие отображения с 4 вложенными классами с тем же именем, так быть в состоянии назвать каждый класс будет необходимо для решения наиболее вложенных проблемных областям

<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 
    <jaxb:bindings schemaLocation="MYWSDL.wsdl">  
     <jaxb:bindings node="//xsd:element[@name='AAAA']//xsd:complexType//xsd:sequence/xsd:element[@name='BBB']//xsd:complexType/xsd:sequence//xsd:element[@name='MyElementName']"> 
      <jaxb:class name="MyElementName1"/> 
     </jaxb:bindings>    
     <jaxb:bindings node="//xsd:element[@name='AAAA']//xsd:sequence/xsd:element[@name='BBB']//xsd:element[@name='MyElementName']//xsd:sequence/xsd:element[@name='CCC']//xsd:sequence/xsd:element[@name='MyElementName']/xsd:complexType"> 
      <jaxb:class name="MyElementName2"/> 
     </jaxb:bindings> 
    </jaxb:bindings> 
</jaxb:bindings> 

здесь XSD (имена полей изменились но будьте же)

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:element minOccurs="0" name="AAA"> 
<xsd:complexType> 
    <xsd:element minOccurs="0" name="BBB"> 
    <xsd:complexType> 
      <xsd:element name="MyElementName">   
      <xsd:complexType>    
       <xsd:sequence> 
       <xsd:element minOccurs="0" name="CCC"> 
        <xsd:complexType> 
        <xsd:sequence> 
         <xsd:element name="MyElementName"> 
         <xsd:complexType> 
          <xsd:sequence> 
          <xsd:element ref="FromDate" /> 
          <xsd:element ref="ThruDate" /> 
          </xsd:sequence> 
         </xsd:complexType> 
         </xsd:element> 
         <xsd:element name="DDD"> 
         <xsd:complexType> 
          <xsd:sequence> 
          <xsd:element ref="DueDate" /> 
          </xsd:sequence> 
         </xsd:complexType> 
         </xsd:element> 
        </xsd:sequence> 
        </xsd:complexType> 
       </xsd:element> 
       <xsd:element minOccurs="0" ref="YYYY" /> 
       <xsd:element minOccurs="0" ref="ZZZZ" /> 
       </xsd:element> 
       </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
    </xsd:complexType>    
    </xsd:element>    
</xsd:complexType>    
</xsd:element> 
</xsd:schema>  

поле MyElementName2 в порядке, который получает встроенный в файл Java, если я пытаюсь привязки ниже, его только первое, что JAXB является отображение на нескольких детей - в том числе тот, который отображается с MyElementName2. XPath всегда привязывается к одному узлу так, может быть, его опцион JAXB, как представляется, расширение входа

здесь является обязательной альтернативой, что приводит к его ошибке ниже

<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 
    <jaxb:bindings schemaLocation="MYWSDL.wsdl">  
     <jaxb:bindings node="//xsd:element[@name='AAA']//xsd:sequence/xsd:element[@name='BBB']//xsd:element[@name='MyElementName']"> 
      <jaxb:class name="MyElementName1"/> 
     </jaxb:bindings>   
     <jaxb:bindings node="//xsd:element[@name='AAA']//xsd:sequence/xsd:element[@name='BBB']//xsd:element[@name='Billing']//xsd:sequence/xsd:element[@name='CCC']//xsd:sequence/xsd:element[@name='MyElementName']/xsd:complexType"> 
      <jaxb:class name="MyElementName2"/> 
     </jaxb:bindings> 
    </jaxb:bindings> 
</jaxb:bindings> 

ошибка:

parsing a schema... 
[ERROR] XPath evaluation of "//xsd:element[@name='AAA']//xsd:sequence/xsd:element[@name='BBB']//xsd:element[@name='MyElementName']" results in too many target nodes 
Failed to parse a schema. 
+0

Никто не может проверить, что вы делаете, если вы не предоставили XML-схему, чтобы ее можно было сопоставить с выражениями XPath, которые вы используете в файле привязок. --- XML-схема, похоже, имеет глубоко вложенные анонимные типы, что плохо. Можете ли вы изменить это - это не значит, что вы измените структуру XML! – laune

+0

Я не могу предоставить xml-схему или изменить ее как ее проприетарную, и использовать ее для взаимодействия без изменений.Я мог бы высмеять это с помощью тегов jaxb только для получения кода, но это будет беспорядок для будущих изменений. – Ralph

+0

Если вы не хотите или не можете даже реорганизовать (переименовать) соответствующую часть XML-схемы, тогда Я не думаю, что кто-нибудь может тебе помочь. – laune

ответ

2

JAXB генерирует один класс на один сложный тип, поэтому я считаю, что вы должны привязать свое собственное имя класса к xs: complexType, а не к элементу xs:. Ваш первый XPath ссылается на элемент xs: и я думаю, JAXB не знает, как связать класс с ним. Попробуйте это связывание:

<jaxb:bindings 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
version="2.1"> 
<jaxb:bindings schemaLocation="MYWSDL.wsdl">  
    <jaxb:bindings node="//xsd:element[@name='AAAA']//xsd:complexType//xsd:sequence/xsd:element[@name='BBB']//xsd:complexType/xsd:sequence//xsd:element[@name='MyElementName']/xs:complexType"> 
     <jaxb:class name="MyElementName1"/> 
    </jaxb:bindings>    
    <jaxb:bindings node="//xsd:element[@name='AAAA']//xsd:sequence/xsd:element[@name='BBB']//xsd:element[@name='MyElementName']//xsd:sequence/xsd:element[@name='CCC']//xsd:sequence/xsd:element[@name='MyElementName']/xsd:complexType"> 
     <jaxb:class name="MyElementName2"/> 
    </jaxb:bindings> 
</jaxb:bindings> 

Лично я предпочитаю использовать JAXB в XMLBeans. Вы должны быть осторожны с последним, потому что при компиляции глубоко вложенной схемы он может генерировать структуру вложенных классов, которые невозможно скомпилировать из-за ограничений длины имени файла (обычно 255 символов).

0

Ваш XPath:

//xsd:element[@name='AAA'] 
//xsd:sequence/xsd:element[@name='BBB'] 
//xsd:element[@name='MyElementName'] 

Кажется ссылаться на оба ваших MyElementName элементов, так как они оба под BBB. Попытайтесь избавиться от //.

//xsd:element[@name='AAA'] 
/xsd:complexType 
/xsd:sequence 
/xsd:element[@name='BBB'] 
/xsd:complexType 
/xsd:sequence 
/xsd:element[@name='MyElementName'] 

Я думаю, что это правильное направление. Вы должны настроить свои анонимные внутренние сложные типы.

Смежные вопросы