直接从源创建Web服务客户端

ben*_*ben 5 java wsdl maven-2 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;
     }
   }  
Run Code Online (Sandbox Code Playgroud)

我可以生成一个war文件并使用glassfish来提供这个webservice,从那里我可以使用glassfish WSDL URL来生成客户端源.

我想要做的是跳过glassfish部分.从定义webservice的maven项目开始,我想使用jaxws-maven-plugin来创建客户端类,但我找不到任何方法来指定webservice的实际URL.

应该可能吧?

@see还使用已知但无法访问的wsdl创建Web服务客户端

Pas*_*ent 6

创建Web服务客户端应用程序总是从现有的WSDL文件开始(与开发Web服务提供者不同),即使这不是唯一的方法,我建议使用该wsimport工具(请参阅5创建Java Web服务的技术)其他选项的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>
Run Code Online (Sandbox Code Playgroud)

jaxws-maven-plugin:wsimport魔咒被默认绑定的generate-sources生命周期阶段,因此运行的任何阶段后,以generate-sources将触发jaxws:wsimport目标.

请注意,这实际上是一个最小配置.如果您想了解更多细节/控制,请查看wsimportmojo 的文档.

例如,要使用文件而不是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>
Run Code Online (Sandbox Code Playgroud)

更新:要调用预配置的存根(使用WSDL中的端点地址),代码为:

Hello port = new HelloService().getHelloPort();
String result = port.sayHello("Duke!");
Run Code Online (Sandbox Code Playgroud)

要调用其地址与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();
Run Code Online (Sandbox Code Playgroud)

这里ORIGINAL_PACKAGE是包凡出版的服务,SERVICENAME是我们需要的,例如服务的名称,HelloService.


roc*_*chb 4

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

使用 -wsdlLocation 开关

还有另一种简单的方法 - 只需使用 -wsdlLocation 开关运行 wsimport 并提供相对于生成的 Service 类的 WSDL 位置值,并且您需要将此 WSDL 文件放在该相对位置。

请参阅帖子了解更多详细信息