我正在尝试直接从@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部分。 从定义webservice的maven项目开始,我想使用jaxws-maven-plugin来创建客户端类,但我找不到任何方法来指定webservice的实际URL。
应该可能吗?
@see Creating a web-service client with a known but inaccessible wsdl
答案 0 :(得分: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
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
。
答案 1 :(得分:3)
您应该使用<wsdlLocation>
选项来提供部署后WSDL文件可用的服务位置。
使用-wsdlLocation开关
还有另一种简单的方法 - 只需使用-wsdlLocation运行wsimport 切换并提供WSDL位置 相对于的价值 您需要生成服务类 将此WSDL文件放在此相对位置 位置。