前言
最近在给部门自己的开发工具写Web界面的测试工具,其中要调用Axis2实现的WebService接口 。
以前没做过,咨询了以前在税局待过的朋友说大体上有两种实现方式:一种是根据wsdl文件生成本地的客户端代码(也就是所谓的stub桩),把代码放在自己的项目里面;一种是通过HttpClient动态代理。
对比
- 速度:把客户端代码放在本地这种方式,调用接口会更快一些。
- 方便:把客户端代码凡在本地然后调用webservie接口,返回的对象可以用wsdl生成的对象接收,然后很方便的使用这些对象。而RPC调用返回的是Object类型,拿到手上也不好用它。
- 灵活:当然呢,Http动态代理调用的好处很明显,就是调用接口的一方不用关心服务端(webService)提供的借口的变化。而生成客户端代码呢,就是一旦webService的接口发生了啥改动就得重新生成Java代码来替换当前的代码。
我最终还是采用了将客户端代码生成到本地,一来对速度要求比较高,二来webService接口端也不会经常发生改动。。。
Wsdl To Java
最终的难点就集中在了如何根据Wsdl生成Java文件并打包,如果有多个Wsdl文件怎么处理。
百度了一下发现有三种方式可以根据Wsdl文件生成Java代码
用IDEA等IDE工具可以很方便的生成(我试过生成出来的代码太凌乱了)
用Axis2或者Cxf自带的工具生成(没试过,读者可以试试)
用JDK自带的wsimport命令生成(我用的这种,挺好用的)
1
wsimport -s D:\temp -p cn.ljl.sand.jws.chapter3.client.wsimport http://localhost:6666/service/interpret?wsdl
遇到的问题
用上面的方式已经生成了Java代码了,但是每次用wsimport只能针对一个wsdl文件生成代码,我查阅了很多资料发现都没有办法针对多个wsdl文件生成Java代码的,唉,如果有办法的朋友请评论区留言告诉我,谢谢。
迫不得已最后写了一个批处理程序来处理。
1 | @echo off |
还有就是wsimport编译生成Java代码的时候可能会遇到wsdl文件里面的枚举值过多的情况,这时候可以添加一个jaxb的绑定文件。
1 | <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" |
这个感觉应该是bug吧。。。请看这个
Re: wsdl2java no verbose output - globalbindings for typesafeEnumMaxMembers