将外部JAXB绑定文件应用于从WSDL导入的模式元素

Cha*_*ase 15 jax-ws jaxb xjc wsimport

外部绑定文件中的XPath表达式无法定位导入到我的WSDL中的XML模式中的元素.

如果我进行内联绑定自定义,一切都会运行,但我真的想拥有外部绑定文件,这样我就不会意外地覆盖(刷新)包含我的自定义的文件.

我的绑定文件的开头:

<jaxb:bindings
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
    version="2.1">
    <jaxb:bindings schemaLocation="../wsdl/localhost_7001/ExampleSessionBean/ExampleSessionBeanService.wsdl#types?schema1">
        <jaxb:bindings node="//xs:schema[@targetNamespace='urn:myExample']">
Run Code Online (Sandbox Code Playgroud)

我的WSDL包含:

<types>
<xsd:schema>
<xsd:import namespace="urn:myExample" schemaLocation="http://localhost:7001/ExampleSessionBean/ExampleSessionBeanService?xsd=1"/>
</xsd:schema>
<xsd:schema>
<xsd:import namespace="http://ejbs/" schemaLocation="http://localhost:7001/ExampleSessionBean/ExampleSessionBeanService?xsd=2"/>
</xsd:schema>
</types>
Run Code Online (Sandbox Code Playgroud)

无论我做什么,XPath都无法在xsd:import'ed模式中找到任何内容.我得到的错误是:

[ERROR] XPath evaluation of "//xs:schema[@targetNamespace='urn:myExample']" results in empty target node
Run Code Online (Sandbox Code Playgroud)

我已经尝试通过索引号而不是命名空间访问xs:schema,但这也不起作用.看起来我的XPath表达式无法从导入的模式中获取元素...无论如何要解决这个问题?

这是在NetBean 7.2下开发的Java SE 7项目.我正在使用NetBeans来完成我所有的wsimport工作,如果这很重要,但命令输出看起来相当标准的RI/Metro.

编辑:我发现如果我使用SCD,我可以获得一个外部绑定文件.此XPath示例不起作用:

<bindings node="//xsd:schema[@targetNamespace='urn:myExample']">
    <bindings node="//xs:complexType[@name='myType']">
        <class name="MyClass"/>
    </bindings>
</bindings>
Run Code Online (Sandbox Code Playgroud)

但这个SCD示例确实如此.

<bindings scd="x-schema::tns" xmlns:tns="urn:myExample">
    <bindings scd="~tns:myType">
        <class name="MyClass"/>
    </bindings>
</bindings>
Run Code Online (Sandbox Code Playgroud)

这是一个众所周知的事情,当使用wsimport时,XPath在xjb文件中不起作用,但是SCD呢?

小智 8

你应该像以下一样使用它:

<jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://duke.example.org']">
    <jaxb:schemaBindings>
        <jaxb:package name="fromwsdl.server"/>
    </jaxb:schemaBindings>
</jaxws:bindings>
Run Code Online (Sandbox Code Playgroud)

注意命名空间

这一切都在这里解释:https: //jax-ws.java.net/nonav/2.1.2/docs/customizations.html


bdo*_*han 5

您可以单独将每个XML模式编译为Java类.然后,您可以利用剧集文件,以便在编译导入该XML架构的架构时可以使用生成的类.

以下是您如何制作剧集文件的示例.

xjc -b binding1.xml -episode common.episode common.xsd
Run Code Online (Sandbox Code Playgroud)

以下是您如何使用和剧集文件的示例.剧集文件只是一个JAXB外部绑定文件,因此使用该-b标志指定.

xjc -d out main.xsd -extension -b common.episode   
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息

  • 这些类并没有真正重用,所以我不需要预先编译它们.无论如何我试过了,我注意到剧集文件使用的是SCD而不是XPath.看起来我可以在外部绑定文件中使用SCD.授予你赏金,因为你的回答帮助我解决了问题. (2认同)