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

时间:2013-02-26 01:43:34

标签: jaxb jax-ws 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']">

我的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文件中不起作用,这是一个众所周知的事情吗?

4 个答案:

答案 0 :(得分: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>

小心命名空间

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

答案 1 :(得分:5)

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

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

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

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

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

了解更多信息

答案 2 :(得分:1)

对于新手,您可以简单地使用两个绑定文件,一个应用于wsdl,另一个应用于架构,使用wsdl2java的-b选项.cxf代码生成类接受多个绑定文件:

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

答案 3 :(得分:0)

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

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

完整配置:

mongoexport -u admin -p password --host hostdirection -d databasename -c collection--authenticationDatabase admin -f "_id,Field1"  -o outputfile.csv 

现金: