代码之家  ›  专栏  ›  技术社区  ›  benji

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

  •  5
  • benji  · 技术社区  · 16 年前

    我正在尝试直接从@webservice类生成WS-client 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来生成客户机源。

    我想做的是跳过玻璃鱼部分。 在定义WebService的Maven项目中,我希望使用JAXWS Maven插件创建客户端类,但我找不到任何方法来指定WebService的实际URL。

    这应该是可能的,对吧?

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

    2 回复  |  直到 16 年前
        1
  •  3
  •   rochb    16 年前

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

    使用-wsdllocation开关

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

    See the post for more details .

        2
  •  5
  •   informatik01 Viswanath Lekshmanan    11 年前

    创建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默认绑定到 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>
    

    更新: 要调用预先配置的存根(使用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 .