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

将外部JAXB绑定文件应用于从WSDL导入的模式元素,jaxb,jax-ws,xjc,wsimport,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://

外部绑定文件中的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']">
我尝试过通过索引号而不是名称空间访问xs:schema,但这也不起作用。似乎我的XPath表达式无法从导入的模式中访问元素……是否有任何方法可以解决此问题

这是一个在NetBean7.2下开发的JavaSE7项目。如果有必要的话,我将使用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起作用,这是已知的吗?

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

下面是一个如何生成插曲文件的示例

xjc -b binding1.xml -episode common.episode common.xsd
下面是一个关于如何使用和处理事件文件的示例。插曲文件只是一个JAXB外部绑定文件,因此使用
-b
标志指定

xjc -d out main.xsd -extension -b common.episode   
了解更多信息


您应该像这样使用它:

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

小心使用名称空间

这里解释如下:

对于新人,您只需使用两个绑定文件,一个应用于wsdl,另一个应用于模式,方法是使用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 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>

假的
“jaxb 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 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>


将此部分添加到我的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>

真的
假的
学分:


这些类没有真正重用,因此我不需要预编译它们。我还是试过了,我注意到插曲文件使用的是SCD而不是XPath。看起来我可以在外部绑定文件中使用SCD。奖励你是因为你的回答帮了我一把。我不是说你不应该奖励你;这是你的赏金。但这并不是问题的真正答案,我希望定制JAXB工件,而不是JAX-WS工件。我并没有试图更改服务类名,而是试图更改复杂的参数类名。如果您查看一下,就会发现wsimport-b可以接受JAX-WS或JAXB绑定文件。我正在尝试使用JAXB绑定文件。这看起来不错,但由于某些原因,XPath不会选择任何节点。如何使用此工具(内部)调试XPath结果?我怎么告诉它“把你看到的都打印出来”?更新:我在绑定中发现了一个错误,我使用的是
jaxb:bindings
而不是
jaxb:schemaBindings
。XPath现在可以编译了。你是说java.net-URL不起作用吗?我试过了。但是现在我得到了以下错误
SCD“~tns:myelement”与任何架构组件都不匹配