Axis 开发web service

来源:互联网 发布:Linux按分钟生成日志 编辑:程序博客网 时间:2024/05/01 19:48
选择Axis的理由:
1. 开发速度快
2. 可移植性好,可在不同的application server, web container中运行
3. 成熟稳定,Axis是从Apache SOAP(IBM SOAP4J)发展过来的,Axis 1.0在2002年10月发布,Axis是许多商业app server的基础,如WebSphere。

开发WSDL
开发Web Service应该从设计WSDL入手。对于使用了复杂数据类型的web service,如果对手写xml schema不是很熟悉可以先编写web service的java接口定义和表示相关的参数、返回值类的类,然后再用Axis的Java2WSDL工具生成wsdl的草稿。
修改生成的wsdl草稿要考虑合理选择binding的方式,WSDL规范定义了两种binding style:rpc和document,rpc意味着web service的客户端和服务端使用远程方法调用的约定进行通信,而使用document意味着客户端和服务端用xml文档进行通信。WSDL还规定了两种use:encoded和literal,literal意味着soap body中的xml是用相应的schema约束的;encoded意味着具体的soap message语义需要指定编码规则(通常是所谓的SOAP encoding,在SOAP规范的第五部分定义,又叫section 5 encoding)来解释。所以在wsdl中共有style/use的四种组合: rpc/encoded, rpc/literal, document/encoded, document/literal。第三种方式没有实际应用。另外,Microsoft提出了一种所谓的document/literal wrapped的方式,它用一个与operation同名的元素作为所有参数的"包装器"。document/literal wrapped方式解决了document/literal方式无法表达operation名称的缺点。
rpc/encoded(Axis默认的方式)可以表达的对象图、多态的数据,wsdl定义的抽象的SOAP数据模型依赖于具体的实现,这可能带来互操作性问题(如Axis的默认使用multi-ref表达soap响应),所以rpc/encoded是WS-I BP1.0规范所禁用的方式。

关于如何合理地选择的style/use方式请参考developerworks上的
http://www-106.ibm.com/developerworks/webservices/library/ws-whichwsdl/

用Axis的Java2WSDL工具生成wsdl可以使用Axis发布时自带的命令行工具或ant task。但两者配置繁琐,本文以maven-axis-plugin为例说明如何使用。maven-axis-plugin的java2wsdl可以根据java的interface或class生产相应的wsdl。
使用该插件前先要下载:
maven plugin:download -DartifactId=maven-axis-plugin -DgroupId=maven-plugins -Dversion=0.6-jus -Dmaven.repo.remote=http://ultra/maven/
然后,需要配置该插件,使用java2wsdl至少需要配置两种信息:一是namespace和package之间的映射关系,二是要暴露为web service的class或interface的名称(FQCN),以及该class的对应的service的location(也就是通过什么url 可以访问到该web service)和namespace。
示例:
# axis java2wsdl plugin settings
maven.java2wsdl.namespaceMappings                      = http://www.ceservice.com.cn/ce/PAPS/exception=com.erry,
http://www.ceservice.com.cn/ce/PAPScom.erry.webservice,
http://www.ceservice.com.cn/ce/PAPS/datatype/baseinfo=com.erry.webservice.VO.baseinfo,
http://www.ceservice.com.cn/ce/PAPS/datatype/srvsht=com.erry.webservice.VO.srvsht
maven.axis.classnames                                  = com.erry.webservice.ServiceSheetServiceSoapBindingImpl
com.erry.webservice.ServiceSheetServiceSoapBindingImpl = http://localhost/services/ServiceSheetService,http://www.ceservice.com.cn/ce/PAPS

namespace和package之间的映射关系的用maven.java2wsdl.namespaceMappings属性表示,其值为逗号分隔的 namespace=package;maven.axis.classnames指定要暴露为web service的class或interface的名称,如果有多个用逗号分隔。每个class或interface还要指定location和 namespace(两者用逗号分隔)。
配置完,运行maven axis:java2wsdl即在target/axis/wsdl目录下产生与class同名(FQCN),wsdl为后缀的文件。


用Axis开发Web Service客户端的步骤
编写完wsdl后,可以用Axis的wsdl2java生成web service的客户端,wsdl2java生成的客户端是stub方式的。它包括endpoint借口、实现该接口的stub、 serviceLocator、可选的单元测试代码。其中,serviceLocator中hard code了服务端地址。可以用spring的dependency injection将服务器地址放在spring bean配置文件中。

使用maven-axis-plugin生成client代码首先需要配置,主要涉及的信息有wsdl文档的位置(maven.axis.url), namespace和package的映射(maven.wsdl2java.namespaceMappings),是否生成单元测试 (maven.axis.testcase)。maven.wsdl2java.namespaceMappings的格式和 maven.java2wsdl.namespaceMappings一样。
示例:
maven.axis.url                        = ${maven.src.dir}/conf/srvshtservice.wsdl
maven.axis.testcase                   = true
maven.wsdl2java.namespaceMappings     = http://www.ceservice.com.cn/ce/PAPS/exception=com.erry,
http://www.ceservice.com.cn/ce/PAPS=com.erry.webservice,
http://www.ceservice.com.cn/ce/PAPS/datatype/baseinfo=com.erry.webservice.VO.baseinfo,
http://www.ceservice.com.cn/ce/PAPS/datatype/srvsht=com.erry.webservice.VO.srvsht

配置完后运行maven axis:wsdl2java即在target/axis/src目录下产生endpoint interface,stub, serviceLocator和data type对应的Java Class。如果maven.axis.testcase为true,则还在target/axis/test目录下生成相应的单元测试代码。

用Axis开发Web Service服务器端的步骤
Axis的wsdl2java工具除了客户端代码外还可以生成服务器端代码的框架和web service部署说明文件(wsdd)。Axis生成的默认wsdd基本上能够满足一般的要求了。其中需要修改的有:将multi-ref设成 false,这只要在globalConfiguration中增加<parameter name="sendMultiRefs" value="false"/>;在service中加入<wsdl>元素指定wsdl文件,而不是让Axis在运行时刻生成。 <wsdl>元素中的文件路径是相对于web app的WEB-INF/classes目录的。

和生成客户端代码类似,使用maven-axis-plugin生成server端框架带和部署说明文件首先需要配置。配置的内容除了wsdl文档的位置,namespace和package的映射外还需要指定deploy scope,maven.axis.serverside设为true表示生成服务端代码。
示例:
maven.axis.url                        = ${maven.src.dir}/conf/srvshtservice.wsdl
maven.axis.deployscope                = application
maven.axis.serverside                 = true
maven.axis.testcase                   = true
maven.wsdl2java.namespaceMappings     = http://www.ceservice.com.cn/ce/PAPS/exception=com.erry,
http://www.ceservice.com.cn/ce/PAPS=com.erry.webservice,
http://www.ceservice.com.cn/ce/PAPS/datatype/baseinfo=com.erry.webservice.VO.baseinfo,
http://www.ceservice.com.cn/ce/PAPS/datatype/srvsht=com.erry.webservice.VO.srvsht

配置完后运行maven axis:wsdl2java即在target/axis/src目录下产生endpoint interface,data type对应的Java Class,JSE框架代码,部署说明文件等。


Axis开发调试工具
Axis自带了一个名为tcpmon的工具用于截获SOAP消息。使用该工具可以看到完整的HTTP请求和响应。本文以maven-axis-plugin为例说明如何启动该工具。
配置
# axis tcpmon plugin settings
maven.axis.tcpmon.listen.port=90
maven.axis.tcpmon.destination.host=localhost
maven.axis.tcpmon.destination.port=80
第一行是tcpmon监听端口,web service的客户端应该向该端口发出请求,第二、三行是web service服务端所在的主机和端口
配置完,运行maven axis:tcpmon即出现tcpmon swing界面。此时,可以运行web service的客户端了。 
原创粉丝点击