wsimport – 如何在单独的项目/文件夹中生成服务端点类和JAXB类

我们对具有多个Web服务(多个WSDL)的项目使用自上而下的方法。 每个Web服务都需要设置为单独的项目,并作为单独的战争部署。

问题是WSDL共享一些常见的.xsd文件。 目前,如果我们为每个WSDL运行wsimport,则每个Web服务项目中都会复制常见的JAXB类。

理想情况下,我们希望在公共共享项目中单独生成JAXB类,然后在每个Web服务项目中重用JAXB类项目,但wsimport不提供跳过JAXB类生成或指定其他位置的选项对于JAXB类。

关于如何在不同的JAX-WS Web服务端点之间共享JAXB类的任何想法?

我知道这个问题很老了,但我想分享那些正在寻找的答案。 我知道我花了一段时间才找到答案。

从JAXB 2.1 RI开始,有一个名为“episodes”的function可以用来促进这一点。

假设您有一个名为myschema.xsd的模式。 然后你想要调用以下内容:

xjc -episode myschema.episode myschema.xsd 

如果您使用单个调用编译多个xsd文件,这也适用。 该调用将生成绑定以及myschema.episode文件。

剧集文件是一个特殊的绑定文件。 然后,您可以将此文件与wsimport一起使用,如下所示:

 wsimport mywsdl.wsdl -b myschema.episode 

wsimport现在将使用以前生成的JAXB文件,并将生成任何缺失的内容。

有关更多信息,请参阅此页面 。

您可以使用JAXB / JAX-WS自定义来实现此目的。 假设您在WSDL中嵌入了XSD类型。 然后您的自定义将如下所示:

          

以上配置引用以下项目目录结构:

 +-- binding | +-- jaxws-binding.xml +-- wsdl | +-- some.wsdl +-- src ... 

如果你使用org.codehaus.mojo:jaxws-maven-plugin插件,那么你需要指定binding

如果您的XSD在WSDL外部,那么您需要单独指定自定义:

 +-- binding | +-- jaxb-binding.xml | +-- jaxws-binding.xml +-- wsdl ... 

然后jaxb-binding.xml将如下所示:

        
  • 对于Ant构建,您只需为不同的包生成两个jar。
  • 因为我个人不知道从一个Maven项目创建两个JAR文件的方法:)然后最简单的解决方案是在project-beans项目中从XSD生成JAXB类,在project-ws项目中删除生成的JAXB类wsimport run(你可以使用ant插件)。

通常我使用IBM Rational工具集看到的内容:

生成所有JAXB和服务类,并将它们与服务项目一起存储。 然后重新生成JAXB和服务客户​​端类并将它们存储在客户端项目中。

是的,这是重复的。 但我认为其背后的原因是它将服务提供商和服务消费者的担忧分开。 从工具集的角度来看,您如何知道您的客户端是.NET,C ++还是Java? 或相反亦然。 如果您是客户,您如何知道提供者是.NET,C ++还是Java等? 你没有。 因此,IBM提供了这种分离关注点的方式。

现在的缺点是,如果您碰巧拥有服务提供商和消费者的来源,那么您将拥有重复的代码。 这可能是一种难以维持的痛苦。

因此,最好将服务和客户端生成到Java项目(而不是J2EE项目或Web项目)中,然后从中创建一个jar。 这样,所有JAXB类都存在(并且只有一次)。 WSDL就在那里(曾经)。 该服务只有一次,可以在EAR或WAR中部署到服务器。 并且客户端存在以防您想要将其提供给某人来使用您的服务。 如果您的客户端允许基于WSDL位置进行动态创建,那就更好了。

我有一篇post可以从向导驱动的角度来帮助你。 它与安全性有关,但您可以从中找到一些有用的提示。

如果你正在使用maven,你可以使用插件来做到这一点。
使用JAXB XJC Maven 2插件