在项目开发中,由于需要与其他的系统对接,然而其他系统的可能是采用C#或者asp.net的语言开发的,所以我们需要通过服务端产生的wsdl来生产客户端。
基于上http://liuwuhen.iteye.com/admin/blogs/1666189采用cxf开发产生的服务端,来实现客户端开发。
1.通过服务端产生的wsdl文件,生成客户端代码 ,cxf的中可以通过wsdl2java命令,自动生成客户端代码。
首先下载apache-cxf-2.0.13源文件,进入到D:\apache-cxf-2.0.13\bin目录,执行
wsdl2java -d src -all HelloWorld.wsdl
-p 指定其wsdl的命名空间,也就是要生成代码的包名。
-d 指定要产生代码所在目录。
-client 生成客户端测试web service的代码。
-server 生成服务器启动web service的代码。
-impl 生成web service的实现代码。
-ant 生成build.xml文件。
-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object。
详细用法见:http://cwiki.apache.org/CXF20DOC/wsdl-to-java.html
由于是通过命令自动生成的,所以产生了代码比较的多,所以我们需要删除XXXService.java,XXX_Client.java、XXX_Server.java
如果是生成服务端代码时,需要注意:
修改以XX_PortTypeImpl.java的结尾的文件,是接口类的实现类,其中也有一行注解:要把这里的
wsdlLocation = "file:HelloWorld.wsdl",
指定wsldLocation的路径,一般放在本地工程的src下面。
在这里生成的客户端接口如下:
@WebService(targetNamespace = "http://cxf.liuwuhen.com/", name = "IHelloWorld")
public interface IHelloWorld {
@RequestWrapper(localName = "sayHello", targetNamespace = "http://cxf.liuwuhen.com/", className = "com.liuwuhen.cxf.SayHello")
@ResponseWrapper(localName = "sayHelloResponse", targetNamespace = "http://cxf.liuwuhen.com/", className = "com.liuwuhen.cxf.SayHelloResponse")
@WebMethod
public void sayHello(
@WebParam(name = "arg0", targetNamespace = "")
java.lang.String arg0
);
}
2.编写相关的测试方法。
基于webservice的客户端测试方法有很多种,可用采用工具例如:SOAPUI,也可以自己编写相关的测试代码。
在这里我采用的是编程式,编写客户端相关测试代码。
public static void main(String[] args)
{
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// 注册WebService接口
factory.setServiceClass(IHelloWorld.class);
// webservice请求地址
String wsdlAdder = "http://localhost:8080/cxf-test/services/sayHello";
// 发布接口
factory.setAddress(wsdlAdder);
IHelloWorld helloWorld = (IHelloWorld) factory.create();
helloWorld.sayHello("cxf hello");
}
3.运行其客户端java类,即可输出 "say cxf hello".