2015-03-13 75 views
0

我试图使用jaxws-maven-plugin WSDL生成类重命名一个类,但我得到不可编译的结果。问题是XSD文件,在这里你可以看到有相同名称的嵌套的元素之一,这部分:XPath来在疯狂层次

<xs:complexType name="TrafficCountsReplyData" abstract="true"> 
<xs:sequence> 
    <xs:element name="effectiveTrafficWindow" type="common:DateTimeMinutePeriod" minOccurs="1" maxOccurs="1"/> 
    <xs:element name="flows" minOccurs="0" maxOccurs="1"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="item" type="flow:Flow" minOccurs="0" maxOccurs="100"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="counts" minOccurs="0" maxOccurs="1"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="item" minOccurs="0" maxOccurs="1440"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="key" type="common:DateTimeMinutePeriod" minOccurs="1" 
             maxOccurs="1"/> 
          <xs:element name="value" minOccurs="0" maxOccurs="1"> 
           <xs:complexType> 
            <xs:sequence> 
             <xs:element name="item" minOccurs="1" maxOccurs="3"> 
              <xs:complexType> 
               <xs:sequence> 
                <xs:element name="key" type="flight:TrafficType" 
                   minOccurs="1" maxOccurs="1"/> 
                <xs:element name="value" type="flow:Counts" minOccurs="1" 
                   maxOccurs="1"/> 
               </xs:sequence> 
              </xs:complexType> 
             </xs:element> 
            </xs:sequence> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:sequence> 
</xs:complexType> 

正如你所看到的,有一个名为item多个元素。这导致多个内部类在单个类中具有相同的名称TrafficCountsReplyData

所以我试图把一个绑定文件重命名其中一个。当我尝试使用到重命名counts元素外item这样的:

<jaxb:bindings node="//xs:complexType[@name='TrafficCountsReplyData']//xs:element[@name='counts']//xs:element[@name='item']"> 
     <jaxb:class name="Lulz"/> 
    </jaxb:bindings> 

我得到以下错误:

[错误]的“// XS XPath计算:复杂类型[@名称=” TrafficCountsReplyData '] //的xs:元素[@名称=' 计数 '] //的xs:元素[@名称=' 项目']”导致太多(2)目标节点

当我创建绑定的xpath表达用于内一个这样的:

<jaxb:bindings node="//xs:complexType[@name='TrafficCountsReplyData']//xs:element[@name='counts']//xs:element[@name='item']//xs:element[@name='value']//xs:element[@name='item']"> 

然后我得到以下错误:

java.lang.IllegalArgumentException异常:非法类继承循环。外部类Lulz可能无法从内部类的子类:Lulz

我无法弄清楚如何使这项工作。遗产从哪里来?还有一个itemflows元素,但是这不应该的XPath匹配。没有绑定文件,我可以生成源代码。我在绑定文件中有正确的模式,因为我可以例如重命名由父元素生成的类。

回答

0

我发现这里的解决方案:JAXB Customizations With a Poorly Formed WSDL

我不得不在Xpath的末尾添加/xs:complexType。我想这是因为类的根实际上是complexType而不是封装xs:元素。所以它是这样的:

<jaxb:bindings node="//xs:complexType[@name='TrafficCountsReplyData']//xs:element[@name='counts']/xs:complexType/xs:sequence/xs:element[@name='item']/xs:complexType"> 
     <jaxb:class name="Lulz"/> 
</jaxb:bindings> 

现在我可以生成类并编译它们。

1

嗯 我有一个类似的问题,但随着性能.. 我不ahve完整XSD检查,但前提是你要到外项目标签变成别的东西,试试这个:

<?xml version="1.0"?> 
    <jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
     xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
     jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     <jxb:bindings schemaLocation="../yourlocation/yourschema.xsd" version="1.0"> 
      <!-- Customise the package name --> 

      <jxb:schemaBindings> 
       <jxb:package name="whatyouwant.something"/> 
      </jxb:schemaBindings> 

      <!-- rename the value element --> 
      <jxb:bindings node="//xs:complexType[@name='TrafficCountsReplyData']//xs:sequence//xs:element[@name='counts']//xs:complexType//xs:sequence//xs:element[@name='item']"> 
        <jaxb:class name="Lulz"/> 
      </jxb:bindings> 
     </jxb:bindings> 
    </jxb:bindings> 

如果这似乎不工作,如果你可以透露XML我应该能够帮助你进一步(在假期之前,直到星期一以防万一),但考虑到你给错了“路径”,跳了几个“子元素“在你的XPath表达式中。 让我知道。

+0

如果我正确地得到它,你已经添加了未命名的元素到xpath,对吗?我已经尝试过,现在就像你所建议的那样,但问题是一样的......太多的目标节点。如果我在那里放置了最内层'item'的完整路径,我仍然会得到'非法类继承循环'。我也尝试过使用单斜杠Xpath并为所有出现的“item”创建绑定条目,但它也没有帮助。我不确定我可以透露XSD,但是无论如何,完整的模式大约有3MB大小,而我有其他绑定文件可以解决其他问题... – NeplatnyUdaj 2015-03-13 17:38:16