【问题标题】:XPath evaluation of results in an empty target nodeXPath 评估空目标节点中的结果
【发布时间】:2017-06-20 19:54:42
【问题描述】:

我的 wsdl 规范包含导入的 XSD 架构。

wsdl 文件如下所示

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" ....>
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd2" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svcc?xsd=xsd4" namespace="http://schemas.datacontract.org/2004/07/System.Web.Services.Protocols"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd0" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd1" namespace="http://schemas.datacontract.org/2004/07/ABCUser.Web.Services"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/ABCUser.Web.ServiceModels"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd5" namespace="http://schemas.datacontract.org/2004/07/System"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd6" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd7" namespace="http://schemas.datacontract.org/2004/07/System.Collections.Generic"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd8" namespace="http://schemas.datacontract.org/2004/07/ABC.Fs.UIEntities"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd9"/>
</xsd:schema>
</wsdl:types>
 .......
 </wsdl:definitions>

我的 jaxb 绑定文件如下所示:

<jaxws:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
    wsdlLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?wsdl">
    <enableWrapperStyle>true</enableWrapperStyle>
    <enableAsyncMapping>false</enableAsyncMapping>
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='Node']/xs:sequence/xs:element[@name='Type']">
    <jaxb:class name="NodeTypeString"/>
    </jaxws:bindings>    
</jaxws:bindings>

如果我不使用 bindings.xml,我会在通过 wsimport 生成 java 类时出现以下错误

[ERROR] Two declarations cause a collision in the ObjectFactory class.
  line 1 of https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd3

[ERROR] (Related to above error) This is the other declaration.
  line 1 of https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd3

它抱怨的架构如下所示

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/ABCUser.Web.ServiceModels" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/ABCUser.Web.ServiceModels">
<xs:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd6" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
.......
<xs:complexType name="Node">
<xs:sequence>
<xs:element minOccurs="0" name="Description" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="Name" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="Type" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="Users" nillable="true" type="tns:ArrayOfUser"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Node" nillable="true" type="tns:Node"/>
......

但是现在当我使用 bindings.xml 时,我得到以下错误

[ERROR] XPath evaluation of "wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='Node']/xs:sequence/xs:element[@name='Type']" results in an empty target node
  line 8 of file:/E:/projects/codegeneration/bindings.xml

我错过了什么?我正在使用 wsimport 来生成类。

【问题讨论】:

    标签: java xpath jaxb wsdl jax-ws


    【解决方案1】:

    &lt;xsd:import&gt; 实际上并没有改变 WSDL 文件的 XML 文档树。您有匹配 wsdl:definitions/wsdl:types/xs:schema/xs:import 的元素,而不是 wsdl:definitions/wsdl:types/xs:schema/xs:complexType/xs:sequence/xs:element

    JAX-WS 规范的“自定义”一章说:

    此外,jaxb:bindings 可以作为 jaxws:bindings 元素的子元素出现在 JAX-WS 外部绑定文件中,该元素的 node 属性指向 WSDL 文档中的 xs:schema 元素。处理架构时,结果必须就像 jaxb:bindings 元素被内联在架构文档中一样,作为架构组件上的注释。

    在处理嵌入在 WSDL 文档中的模式文档的 JAXB 绑定声明(即 jaxb:bindings 元素)时,出现在其中的所有 XPath 表达式必须被解释为好像包含的 xs:schema 元素是独立架构文档。

    因此,您的内部 jaxws:bindings 元素必须包含 xs:schema 元素的 XPath,而不是它的任何后代:

    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema">
        <jaxb:bindings node="xs:complexType[@name='Node']/xs:sequence/xs:element[@name='Type']">
            <jaxb:class name="NodeTypeString"/>
        </jaxb:bindings>
    </jaxws:bindings>    
    

    我不确定以上内容是否真的适用于使用 &lt;xsd:import&gt; 的架构。您可能必须明确引用导入的架构:

    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema">
        <jaxb:bindings schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd2">
            <jaxb:bindings node="xs:complexType[@name='Node']/xs:sequence/xs:element[@name='Type']">
                <jaxb:class name="NodeTypeString"/>
            </jaxb:bindings>
        </jaxb:bindings>
    </jaxws:bindings>    
    

    【讨论】:

    • 我尝试了您的解决方案,但它给了我关于导致冲突的两个声明的原始错误。甚至不确定这是否可能。
    【解决方案2】:

    对于我所面临的这个问题,我有两个解决方案。

    1. 我通过在其中添加导入的模式并删除导入语句来简化 wsdl 模式。
    2. 首先使用xjc 为导入的架构构建一个情节

      xjc -episode myschema.episode myschema.xsd

      然后通过 wsimport 将该片段用作 java 类生成中的绑定

      wsimport mywsdl.wsdl -b myschema.episode

    更多关于第二个解决方案here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 2010-10-04
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      相关资源
      最近更新 更多