2013-02-26 113 views
13

我的外部绑定文件中的XPath表达式无法定向到我的XML模式中导入到我的WSDL中的元素。将外部JAXB绑定文件应用于从WSDL导入的模式元素

如果我执行内联绑定自定义,所有内容都会运行,但我真的希望拥有外部绑定文件,这样我就不会意外覆盖(刷新)包含我的自定义项的文件。

我约束力文件的开头:

<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:通过索引号,而不是命名空间的架构,并且也不管用。看起来我的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> 

这是一个众所周知的事情,XPath在使用wsimport时不能在xjb文件中工作,但是SCD会这样吗?

+0

我尝试这样做。但是现在我得到下面的错误'SCD“〜tns:myelement”没有匹配任何模式组件' – wib 2015-09-11 06:01:19

回答

4

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

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

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

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

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

更多信息

+2

这些类没有真正重用,所以我不需要预编译它们。无论如何我都试过,我注意到情节文件使用SCD而不是XPath。它看起来像我可以在外部绑定文件中使用SCD。奖励你的赏金,因为你的答案帮助我解决问题。 – Chase 2013-03-02 19:11:04

+1

我并不是说你不应该奖励赏金;这是你的赏金。但这不是真正的答案。 – Cheeso 2013-03-19 20:40:47

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

我期待自定义JAXB构件,而不是JAX-WS构件。我不想更改服务类名称,我试图更改复杂的参数类名称。如果您查看http://docs.oracle.com/javase/6/docs/technotes/tools/share/wsimport.html,您会看到wsimport -b可以采用JAX-WS或JAXB绑定文件。我正在尝试使用JAXB绑定文件。 – Chase 2013-04-23 16:03:37

+0

这看起来不错,但由于某些原因,XPath不会选择任何节点。如何使用此工具(内部)调试XPath结果?我如何说出_“打印您看到的所有内容”_? _Update_:我在绑定中发现了一个错误,我使用'jaxb:bindings'而不是'jaxb:schemaBindings'。 XPath现在编译。 – aliopi 2017-10-31 09:15:11

+0

_java.net_-URL不起作用,你的意思是https://javaee.github.io/metro-jax-ws/doc/user-guide/ch03.html#users-guide-wsdl-customization? – aliopi 2017-10-31 09:35:49

0

对于新的人,你可以简单地通过使用的WSDL2Java的-b选项CXF代码生成类接受使用两个绑定文件,应用于WSDL和其他适用于一个架构多个绑定文件:

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

0

添加此节我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> 

现金