11

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

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

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

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

4

4 回答 4

14

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

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

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

xjc -episode myschema.episode myschema.xsd

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

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

wsimport mywsdl.wsdl -b myschema.episode

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

请参阅此页面了解更多信息。

于 2012-04-30T21:30:36.183 回答
7

您可以使用JAXB / JAX-WS定制来实现这一点。假设您将 XSD 类型嵌入到 WSDL 中。然后您的自定义将如下所示:

<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>
  • 对于 Ant 构建,您只需为不同的包生成两个 jar。
  • 因为我个人不知道从一个 Maven 项目创建两个 JAR 工件的任何方法:) 那么最简单的解决方案是让您在项目中从 XSD 生成 JAXB 类,project-beans并在project-ws项目中在 wsimport 运行后删除生成的 JAXB 类(您可以使用ant 插件)。
于 2011-11-21T15:46:32.853 回答
1

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

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

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

现在,如果您碰巧拥有服务提供者和消费者的源代码,那么这样做的缺点是您有重复的代码。这可能是一个痛苦的维护。

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

我有一个帖子可以从向导驱动的角度帮助你。它与安全性更相关,但您可能会从中找到一些有用的提示。

于 2011-11-21T15:34:15.677 回答
0

如果您使用的是 maven,则可以使用插件来执行此操作。
使用 JAXB XJC Maven 2 插件

于 2011-11-21T13:51:46.603 回答