【问题标题】:Applying external JAXB binding file to schema elements imported from WSDL将外部 JAXB 绑定文件应用于从 WSDL 导入的模式元素
【发布时间】:2013-02-26 01:43:34
【问题描述】:

我的外部绑定文件中的 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']">

我的 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>

无论我做什么,XPath 在 xsd:import'ed 模式中都找不到任何东西。我得到的错误是:

[ERROR] XPath evaluation of "//xs:schema[@targetNamespace='urn:myExample']" results in empty target node

我尝试通过索引号而不是命名空间访问 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>

但这个 SCD 示例可以。

<bindings scd="x-schema::tns" xmlns:tns="urn:myExample">
    <bindings scd="~tns:myType">
        <class name="MyClass"/>
    </bindings>
</bindings>

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

【问题讨论】:

  • 我试过这个。但现在我收到以下错误SCD "~tns:myelement" didnt match any schema component

标签: jaxb jax-ws xjc wsimport


【解决方案1】:

你应该像这样使用它:

<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>

注意命名空间

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

【讨论】:

  • 我正在寻找自定义 JAXB 工件,而不是 JAX-WS 工件。我不会尝试更改服务类名称,而是尝试更改复杂的参数类名称。如果您查看docs.oracle.com/javase/6/docs/technotes/tools/share/…,您会看到 wsimport -b 可以采用 JAX-WS 或 JAXB 绑定文件。我正在尝试使用 JAXB 绑定文件。
  • 这看起来不错,但由于某种原因,XPath 不会选择任何节点。您如何使用(内部)此工具调试 XPath 结果?我如何告诉它“打印你看到的一切”更新:我在绑定中发现了一个错误,我使用的是jaxb:bindings 而不是jaxb:schemaBindings。 XPath 现在编译。
  • 那个 java.net-URL 不起作用,你的意思是 javaee.github.io/metro-jax-ws/doc/user-guide/… 吗?
【解决方案2】:

您可以将每个 XML 模式分别编译为 Java 类。然后,您可以利用情节文件,以便在编译导入该 XML 模式的模式时可以使用生成的类。

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

xjc -b binding1.xml -episode common.episode common.xsd

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

xjc -d out main.xsd -extension -b common.episode   

更多信息

【讨论】:

  • 这些类并没有真正重用,所以我不需要预编译它们。无论如何我都试过了,我注意到剧集文件使用的是 SCD 而不是 XPath。看起来我可以在外部绑定文件中使用 SCD。奖励您赏金,因为您的回答帮助我解决了问题。
  • 我并不是建议你不应该奖励赏金;这是你的赏金。但这并不是问题的真正答案。
【解决方案3】:

对于新人,你可以简单地使用两个绑定文件,一个应用于wsdl,另一个应用于schema,通过使用wsdl2java cxf代码生成类的-b选项接受多个绑定文件:

<java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true">
    <arg value="-d"/>
    <arg value="${src}"/>
    <arg value="-b"/>
    <arg value="${wsdl.home}\jaxws-bindings.xml"/>
    <arg value="-b"/>
    <arg value="${wsdl.home}\jaxb-bindings.xml"/>
    <arg value="${wsdl.home}\YOUR_WSDL.wsdl"/>
    <classpath>
        <path refid="cxf.classpath"/>
    </classpath>
</java>

文件'jaxws-bindings.xml'的内容:

<jaxws:bindings wsdlLocation="YOUR_WSDL.wsdl"
                xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
</jaxws:bindings>

“jaxb-bindings.xml”的内容:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
               jaxb:version="2.0">
    <jaxb:bindings schemaLocation="ManagePartyCustomerDataManagement_PARTY_G7-IOP_In_1.0.xsd">
        <jaxb:bindings node="//xsd:element[@name='eventDate']">
            <jaxb:javaType name="java.util.Date" 
                       parseMethod="com.sofrecom.gaia.ebs.provider.utils.jaxb.StringDateAdapter.parseDate"
                       printMethod="com.sofrecom.gaia.ebs.provider.utils.jaxb.StringDateAdapter.printDate" />
  </jaxb:bindings>

【讨论】:

    【解决方案4】:

    将此部分添加到我的 JAXB 配置有助于消除类似错误:

    <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
       <jaxws:enableWrapperStyle>true</jaxws:enableWrapperStyle>
       <jaxws:enableAsyncMapping>false</jaxws:enableAsyncMapping>
    </jaxws:bindings>
    

    完成配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <jaxb:bindings version="2.1" 
                    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
                    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
                    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
        <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
            <jaxws:enableWrapperStyle>true</jaxws:enableWrapperStyle>
            <jaxws:enableAsyncMapping>false</jaxws:enableAsyncMapping>
        </jaxws:bindings>
    
        <jaxb:bindings schemaLocation="ContactService.wsdl" node="/wsdl:definitions/wsdl:types/xs:schema">
            <jaxb:schemaBindings>
                <jaxb:package name="za.org.kuali.kfs.sys.integration.iapi.contactservice"/>
            </jaxb:schemaBindings>
        </jaxb:bindings>
    
    </jaxb:bindings>
    

    学分:

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 2016-07-05
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      相关资源
      最近更新 更多