java - 直接从源代码创建 Web 服务客户端

标签 java maven-2 wsdl jax-ws

我正在尝试直接从@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

最佳答案

创建 Web 服务客户端应用程序总是从现有的 WSDL 文件开始(与开发 Web 服务提供者不同),即使这不是唯一的方法,我也建议使用 wsimport工具(有关其他选项,请参阅 5 Techniques for Creating Java Web Services from WSDL,但我不会介绍它们)。

因此,在您的客户端项目中,将以下代码片段添加到您的 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 默认绑定(bind)到 generate-sources 生命周期阶段,因此在 generate-sources 之后运行任何阶段 将触发 jaxws:wsimport 目标。

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

例如,要使用文件而不是 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>

更新:要调用预配置 stub (使用来自 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

关于java - 直接从源代码创建 Web 服务客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2131001/

相关文章:

java - 如何修改从java传递给jni的int参数

java - 如何使用 ExecutorService.submit(Runnable r, T result) 方法?

unit-testing - IntelliJ IDEA 调试器在调试 Maven 测试时跳过断点

php - 在 PHP 中验证对 WSDL 的传入 SOAP 请求

java - 无法从 WSDL 生成 stub /java 骨架

xml - 根据 WSDL(xsd 架构)验证 xml 时了解 elementFormDefault 合格/不合格

java - 替换 2D char* 数组中的字符串值 c/java jni

java - 实例化 EntityManager 的最佳实践

java - java tomcat应用程序的Maven项目配置

java - 项目中新依赖项的 NoClassDefFoundError