2010-01-25 29 views
5

我试图直接从@Webservice类生成WS客户端jar。直接从源创建Web服务客户端

让我们这个例子:

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来创建客户端类,但是我找不到任何指定webservice的实际URL的方法。

应该可以吧?

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

回答

3

您应该使用<wsdlLocation>选项来指定WSDL文件在部署后可用的位置。

使用-wsdlLocation开关

还有一种简单的方法来做到这一点 - 只是运行的wsimport与-wsdlLocation 开关,并提供WSDL位置 值,它是相对于 生成的服务类并且您需要 将此WSDL文件放在此相对位置 的位置。

See the post for more details

+0

所以你说你应该从以前的运行中下载一份WSDL的副本。对于Metro来说,这可能很难,因为它包含额外的查找。 – 2012-08-16 13:25:19

5

创建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魔力默认绑定到generate-sources生命周期阶段,因此运行的任何阶段后,以generate-sources将触发jaxws:wsimport目标。

请注意,这是一个非常小的配置。如果你想要更多的细节/控制,请查看wsimport mojo的文档。

例如,使用文件而不是网址为WSDL(并产生更符合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的名称。

+0

如果我使用最后一个解决方案(从wsdl文件生成客户端),那么客户端jar将不包含webservice的URL。有没有办法给它提供maven?我只看到标签,但没有别的... – ben 2010-01-25 19:40:43

+0

这非常有帮助;谢谢一堆! – 2012-03-19 11:45:35

+1

在Metro中使用'@ WebService'时,WSDL是在运行时生成的,因此在编译时可能不可用。 – 2012-08-16 13:22:42