从WSDL生成客户端和服务端
原文地址:
http://xfire.codehaus.org/Client+and+Server+Stub+Generation+from+WSDL
这片导航将一步一步地引导你为一个服务创建客户端.这个过程还同样适用于创建服务端.
完整的Example可以在distribution版本的"examples/geoip-client"文件夹中找到
限制
生成中有几个限制点需要注意
需要java 5.0环境,因为其使用了JSR 181 规范
不支持RPC/Encoding
生成客户端/服务端
Ant Task
我们将要使用的这个webservice获取一个ip地址,返回给我们一个国家的名称。生成客户端十分简单,这里有个build file的例子用于运行Xfire中的wsgen task。
xml 代码
< taskdef name = "wsgen" classname = "org.codehaus.xfire.gen.WsGenTask" classpathref = "maven.compile.classpath" /> < wsgen outputDirectory = "${basedir}/target/generated-source" wsdl = "${basedir}/src/wsdl/geoip.wsdl" package = "net.webservicex.geoip.jaxb" overwrite = "true" />
配置
命令行:
你还可以从命令行来运行WsGen(如果需要绑定jaxb,xmlbeans,你需要相关的jar文件),使用如下的脚本:
script 代码
gpath=xfire- all -1.2-SNAPSHOT.jar:ant-1.6.5.jar:jaxb-api-2.0EA3.jar:stax-api-1.0.1.jar:jdom-1.0.jar:jaxb-impl-2.0EA3.jar\ :jaxb-xjc-2.0-ea3.jar:wstx-asl-2.9.3.jar:commons-logging-1.0.4.jar:activation-1.1.jar:wsdl4j-1.5.2.jar:XmlSchema-1.0.3.jar:xfire-jsr181-api-1.0-M1.jar; java -cp $gpath org.codehaus.xfire.gen.WsGen -wsdl http://localhost:8080/xfire/services/Bookservice?wsdl -o . -p pl.tomeks.client -overwrite true
你可以指定下面的参数:
-wsdl : wsdl file的路径,可以是有效的URL地址 ( can be any valid url )
-o : 生成类的输出文件夹
-package : 客户端代码存放的包
-binding : 绑定使用( jaxb 或者 xmlbeans )
-overwrite: 允许覆盖已有的生成类文件(没有这个选项,则不会覆盖)
使用客户端
现在使用该客户端相当简单
java 代码
package net.webservicex.geoip; import net.webservicex.GetGeoIP; import net.webservicex.geoip.jaxb.GeoIPServiceClient; import net.webservicex.geoip.jaxb.GeoIPServiceSoap; import junit.framework.TestCase; public class GeoIPClientTest extends TestCase { public void testClient() throws Exception { GeoIPServiceClient service = new GeoIPServiceClient(); GeoIPServiceSoap geoIPClient = service.getGeoIPServiceSoap(); System.out.println( "The country is: " + geoIPClient.getGeoIP( "216.73.126.120" ).getCountryName()); } }
你会发现 GeoIPImpl class也被生成了,如果你正在使用客户端,你不能删除它,因为它含有用来生成客户端的注释。Impl class 和wsdl中的<binding></binding>相符,它包含soap绑定信息。
使用如下的代码,你可以为客户端增加新的handlers 或者设置属性
java 代码
Client client = Client.getInstance(geoIPClient); client.setProperty(Channel.USERNAME, "test" ); client.setProperty(Channel.PASSWORD, "test" ); client.addInHandler( new DOMOutHandler());
XMLBeans 客户端/服务 生成
你可以使用XMLBeans 作为绑定来替代JAXB2.0.
简单地在task中设置绑定参数
xml 代码
< wsgen outputDirectory = "target/services" wsdl = "${basedir}/src/wsdl/echoW.wsdl" package = "com.acme.echo" binding = "xmlbeans" overwrite = "true" />
请注意,你需要先生成该wsdl的XMLBeans ,然后把它的jar包放到wsgen-task的classpath下面。
如果你忘记了这步,你会看到 NullPointerException.