根据WSDL文件生成调用RPC的Java代码

前言

最近在给部门自己的开发工具写Web界面的测试工具,其中要调用Axis2实现的WebService接口 。

以前没做过,咨询了以前在税局待过的朋友说大体上有两种实现方式:一种是根据wsdl文件生成本地的客户端代码(也就是所谓的stub桩),把代码放在自己的项目里面;一种是通过HttpClient动态代理。

对比

  1. 速度:把客户端代码放在本地这种方式,调用接口会更快一些。
  2. 方便:把客户端代码凡在本地然后调用webservie接口,返回的对象可以用wsdl生成的对象接收,然后很方便的使用这些对象。而RPC调用返回的是Object类型,拿到手上也不好用它。
  3. 灵活:当然呢,Http动态代理调用的好处很明显,就是调用接口的一方不用关心服务端(webService)提供的借口的变化。而生成客户端代码呢,就是一旦webService的接口发生了啥改动就得重新生成Java代码来替换当前的代码。

我最终还是采用了将客户端代码生成到本地,一来对速度要求比较高,二来webService接口端也不会经常发生改动。。。

Wsdl To Java

最终的难点就集中在了如何根据Wsdl生成Java文件并打包,如果有多个Wsdl文件怎么处理。

百度了一下发现有三种方式可以根据Wsdl文件生成Java代码

  1. 用IDEA等IDE工具可以很方便的生成(我试过生成出来的代码太凌乱了)

  2. 用Axis2或者Cxf自带的工具生成(没试过,读者可以试试)

  3. 用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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off 
setlocal ENABLEDELAYEDEXPANSION

set postfix=Http.wsdl
set pwd=C:\Users\zxr\Desktop\wsdl
set pwd_jaxb=C:/Users/zxr/Desktop/WsdlToJava/jaxb_bind.xml

for /R "%pwd%" %%i in (*) do (
set filename=%%~fpi
call :check %%~fpi
)

pause

:check
for %%i in (%postfix%) do (
echo %1|findstr "%%i" && wsimport -extension -keep -b %pwd_jaxb% %filename%
)
goto :eof
pause

还有就是wsimport编译生成Java代码的时候可能会遇到wsdl文件里面的枚举值过多的情况,这时候可以添加一个jaxb的绑定文件。

1
2
3
4
5
6
7
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
jaxb:version="2.0">
<jaxb:bindings >
<jaxb:globalBindings generateElementProperty="false" typesafeEnumMaxMembers="2000"/>
</jaxb:bindings>
</jaxb:bindings>

这个感觉应该是bug吧。。。请看这个

Re: wsdl2java no verbose output - globalbindings for typesafeEnumMaxMembers

zhangxingrui wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!