【问题标题】:Creating a web-service client directly from the source直接从源创建 Web 服务客户端
【发布时间】:2010-01-25 08:21:12
【问题描述】:

我正在尝试直接从@Webservice 类生成 WS 客户端 jar。

让我们举个例子:

package com.example.maven.jaxws.helloservice;
   
import javax.jws.WebService;

@WebService
public class Hello {
     public String sayHello(String param) {
        return "Hello " + param;
     }
}  

我可以生成一个 war 文件并使用 GlassFish 来提供这个 Web 服务,然后我可以使用 glassfish WSDL URL 来生成客户端源代码。

我想要做的是跳过 GlassFish 部分。 在我定义 web 服务的 maven 项目中,我想使用 jaxws-maven-plugin 创建客户端类,但我找不到任何方法来指定 web 服务的实际 URL。

应该可以吧?

@另见Creating a web-service client with a known but inaccessible wsdl

【问题讨论】:

    标签: java maven-2 wsdl jax-ws


    【解决方案1】:

    创建 Web 服务客户端应用程序总是从现有的 WSDL 文件开始(与开发 Web 服务提供者不同),即使这不是唯一的方法,我还是建议使用 wsimport 工具(参见 @987654321 @ 用于其他选项,但我不会介绍它们)。

    因此,在您的客户端项目中,将以下 sn-p 添加到您的 pom.xml

    <build>
      <plugins>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>jaxws-maven-plugin</artifactId>
          <executions>
            <execution>
              <goals>
                <goal>wsimport</goal>
              </goals>
              <configuration>
                <wsdlUrls>
                  <wsdlUrl>
                    http://localhost:8080/helloservice/HelloService?wsdl
                  </wsdlUrl>
                </wsdlUrls>
                <packageName>com.example.maven.jaxws.helloclient</packageName>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    <bulid>
    

    jaxws-maven-plugin:wsimport mojo 默认绑定到generate-sources 生命周期阶段,因此运行generate-sources 之后的任何阶段都将触发jaxws:wsimport 目标。

    请注意,这实际上是一个最小配置。如果您想要更多详细信息/控制,请查看wsimport mojo 的文档。

    例如,要对 WSDL 使用文件而不是 URL(并在更符合 maven 最佳实践的位置生成 Java 代码),请使用:

    <configuration>
      <sourceDestDir>${project.build.directory}/generated-sources/wsimport</sourceDestDir>
      <wsdlDirectory>${basedir}/src/wsdl</wsdlDirectory>
      <wsdlFiles>
        <wsdlFile>foo.wsdl</wsdlFile>
        <wsdlFile>bar.wsdl</wsdlFile>
      </wsdlFiles> 
      ...
    </configuration>
    

    更新:要调用预先配置的存根(使用来自 WSDL 的端点地址),代码是:

    Hello port = new HelloService().getHelloPort();
    String result = port.sayHello("Duke!");
    

    为了调用地址与 WSDL 中指定的地址不同的端点,请定义新的端点 URL 和 QName:

    URL endpoint_new = new URL( "NEW_ADDRESS_HERE" );
    QName qname = new QName( "http://"+"ORIGINAL_PACKAGE", "SERVICENAME" );
    Hello port = new HelloService( endpoint_new, qname ).getHelloPort();
    

    其中ORIGINAL_PACKAGE是服务发布所在的包,SERVICENAME是我们需要的服务的名称,例如HelloService

    【讨论】:

    • 如果我使用您的最后一个解决方案(从 wsdl 文件生成客户端),那么客户端 jar 将不包含 Web 服务的 URL。有没有办法为它提供 maven ?我只看到 标记,但没有其他...
    • 在 Metro 中使用 @WebService 时,WSDL 是在运行时生成的,因此在编译时可能不可用。
    【解决方案2】:

    您应该使用&lt;wsdlLocation&gt; 选项来提供部署后WSDL 文件可用的服务位置。

    使用 -wsdlLocation 开关

    还有另一种简单的方法 - 只需使用 -wsdlLocation 运行 wsimport 切换并提供 WSDL 位置 相对于 生成的服务类,你需要 将此 WSDL 文件放在此相对位置 位置。

    See the post for more details.

    【讨论】:

    • 所以您说您应该从以前的运行中下载 WSDL 的副本。对于 Metro,这可能很难,因为它包含额外的查找。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多