Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java wsimport—如何在单独的项目/文件夹中生成服务端点类和JAXB类_Java_Web Services_Jaxb_Jax Ws_Wsimport - Fatal编程技术网

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

Java wsimport—如何在单独的项目/文件夹中生成服务端点类和JAXB类,java,web-services,jaxb,jax-ws,wsimport,Java,Web Services,Jaxb,Jax Ws,Wsimport,我们对具有多个web服务(多个WSDL)的项目使用自顶向下的方法。每个web服务都需要作为单独的项目进行设置,并作为单独的war进行部署 问题是WSDL共享一些常见的.xsd文件。当前,如果我们为每个WSDL运行wsimport,那么每个web服务项目中的公共JAXB类都会被复制 理想情况下,我们希望在公共共享项目中分别生成JAXB类,然后在每个web服务项目中重用JAXB类项目,但wsimport不提供跳过JAXB类生成或为JAXB类指定不同位置的选项 关于如何在不同的JAX-WS web服务

我们对具有多个web服务(多个WSDL)的项目使用自顶向下的方法。每个web服务都需要作为单独的项目进行设置,并作为单独的war进行部署

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

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


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

如果您使用的是maven,可以使用插件来实现这一点。

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

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

是的,这是复制品。但我认为其背后的原因是,它将服务提供者和服务消费者的担忧分开。从工具集的角度来看,如何知道客户端是.NET、C++还是java?反之亦然。如果你是一个客户端,你怎么知道提供者是.NET、C++还是java等等?你没有。因此,IBM提供了这种分离关注点的方法

现在这样做的缺点是,如果您碰巧同时拥有服务提供者和使用者的源代码,那么您就会有重复的代码。这可能是一个痛苦的维持

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


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

您可以使用/customization实现这一点。假设您将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>
<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>
如果使用
org.codehaus.mojo:jaxws-maven-plugin
plugin,则需要指定
binding

如果XSD位于WSDL外部,则需要单独指定定制:

+-- binding
|   +-- jaxb-binding.xml
|   +-- jaxws-binding.xml
+-- wsdl
    ...
然后
jaxb binding.xml
将如下所示:

<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>
<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工件:),那么最简单的解决方案就是在
    projectbeans
    project和
    projectws
    project中从XSD生成JAXB类,并在wsimport运行后删除生成的JAXB类(您可以使用ant插件)

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

从JAXB2.1RI开始,您可以使用一个名为“剧集”的特性来实现这一点

假设您有一个名为myschema.xsd的模式。然后,您需要调用以下命令:

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

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

wsimport mywsdl.wsdl -b myschema.episode
wsimport现在将使用先前生成的JAXB文件,并将生成缺少的任何内容


有关更多信息,请参阅。

我认为(但我可能在这方面错了)您要求的两个选项都不可能。不能跳过JAXB生成,因为web服务依赖于各种存根才能生成。另外,由于所有导入,不同目录的规范也不是一个选项。我的最佳猜测是您必须自己(手动)重构代码但我可能错了。让我们看看是否有人知道这一点sure@ChrisAldrich我正在为此使用IBMRAD7.5.5project@user384706谢谢你的意见。我也找不到为jax-ws-source和jaxb-source类指定不同位置的方法。最后一种方法是手动移动/重新排列生成的源代码。非常有用,特别是对于导入的架构,您需要一个单独的绑定文件。非常感谢。非常有用,我用这个解决方案解决了“同名的类/接口已经在使用”。