对于具有多个Web服务(多个WSDL)的项目,我们使用自上而下的方法。每个Web服务都需要设置为单独的项目,并作为单独的战争部署。
问题是WSDL共享一些常见的.xsd文件。目前,如果我们为每个WSDL运行wsimport,则每个Web服务项目中都会复制常见的JAXB类。
理想情况下,我们希望在公共共享项目中单独生成JAXB类,然后在每个Web服务项目中重用JAXB类项目,但wsimport不提供跳过JAXB类生成或指定的选项JAXB类的不同位置。
关于如何在不同的JAX-WS Web服务端点之间共享JAXB类的任何想法?
答案 0 :(得分:12)
我知道这个问题很老,但我想分享那些正在寻找的答案。我知道我花了一段时间才找到答案。
从JAXB 2.1 RI开始,有一个名为“剧集”的功能可以用来促进这一点。
假设您有一个名为myschema.xsd的模式。然后你想要调用以下内容:
xjc -episode myschema.episode myschema.xsd
如果您使用单个调用编译多个xsd文件,这也有效。该调用将生成绑定以及myschema.episode文件。
剧集文件是一个特殊的绑定文件。然后,您可以将此文件与wsimport一起使用,如下所示:
wsimport mywsdl.wsdl -b myschema.episode
wsimport现在将使用以前生成的JAXB文件,并将生成任何缺失的内容。
有关详细信息,请参阅this page。
答案 1 :(得分:5)
您可以使用JAXB / JAX-WS自定义来实现此目的。假设您在WSDL中有XSD类型嵌入。然后您的自定义将如下所示:
<jaxws:bindings version="2.0"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
wsdlLocation="../wsdl/some.wsdl">
<jaxws:package name="org.company.project.ws" />
<!-- XSD types customization within WSDL -->
<jaxb:bindings node="//xsd:schema">
<jaxb:schemaBindings>
<jaxb:package name="org.company.project.beans" />
</jaxb:schemaBindings>
</jaxb:bindings>
</jaxws:bindings>
以上配置引用以下项目目录结构:
+-- binding
| +-- jaxws-binding.xml
+-- wsdl
| +-- some.wsdl
+-- src
...
如果您使用org.codehaus.mojo:jaxws-maven-plugin
插件,则需要指定<bindingDirectory>binding</bindingDirectory>
。
如果您的XSD是WSDL的外部,那么您需要单独指定自定义:
+-- binding
| +-- jaxb-binding.xml
| +-- jaxws-binding.xml
+-- wsdl
...
然后jaxb-binding.xml
将如下所示:
<jaxb:bindings version="1.0"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<jaxb:bindings schemaLocation="my.xsd" node="//xsd:schema">
<jaxb:schemaBindings>
<jaxb:package name="org.company.project.beans" />
</jaxb:schemaBindings>
</jaxb:bindings>
</jaxb:bindings>
project-beans
项目和{{1}中从XSD生成JAXB类在wsimport运行后删除生成的JAXB类(你可以使用ant插件)。答案 2 :(得分:1)
通常我使用IBM Rational工具集看到的内容:
生成所有JAXB和服务类,并将它们与服务项目一起存储。然后重新生成JAXB和服务客户端类,并将它们存储在客户端项目中。
是的,这是重复的。但我认为其背后的原因是它将服务提供商和服务消费者的担忧分开。从工具集的角度来看,您如何知道您的客户端是.NET,C ++还是Java?或相反亦然。如果您是客户,您如何知道提供者是.NET,C ++还是Java等?你没有。因此,IBM提供了这种分离关注点的方式。
现在的缺点是,如果您碰巧拥有服务提供商和消费者的来源,那么您将拥有重复的代码。这可能是一种难以维持的痛苦。
所以也许最好将服务和客户端生成到Java项目(不是J2EE项目或Web项目)中,然后从中创建一个jar。这样,所有JAXB类都存在(并且只有一次)。 WSDL就在那里(曾经)。该服务只有一次,可以在EAR或WAR中部署到服务器。并且客户端存在以防您想要将其提供给某人来使用您的服务。如果您的客户端允许基于WSDL位置进行动态创建,那就更好了。
从向导驱动的角度来看,我已经a post that may help了。它与安全性更相关,但您可以从中找到一些有用的提示。
答案 3 :(得分:0)
如果你正在使用maven,你可以使用插件来做到这一点 Using the JAXB XJC Maven 2 Plugin