公司决定将自己的产品对外提供web service。收集了很长时间资料,查了很多关于web service相关的信息结合我们公司产品的特点,总结出了一些小经验供我日后回忆和正在受axis2折磨中的兄弟们借鉴。下面就开始吧!
?
1.WS Framework框架的选择
网上有很多资深的评论家早已对这个问题做出了很精辟的总结,我在这说纯属废话。我选择axis2的原因很简单,公司产品是基于古老的JDK1.4开发的。CXF最新版本只支持1.5的JDK,而axis2支持1.4的!我想就这一个原因足以构成选择axis2的结果了吧。
?
2.构建axis2.war
网上很多文章都是基于tomcat怎么去发布axis2的,但是稍微大一点的系统人家都喜欢买个WebSphere来玩玩。用tomcat感觉想看不起他们一样!?下面介绍一下在WebSphere构建你的axis2.war。
从?http://ws.apache.org/axis2/download/1_0/download.cgi? 网站下载AXIS2 1.3。现在的版本是1.4。如果用1.4的话控制台在运行时会有一个JDK版本的错报出来,查了一下网上说是因为runtime的JDK跟Compiler的JDK不匹配。个人觉得这个解释就是扯淡,我不至于粗心到这个地步吧。但是确实是一起服务就报错。姑且相信他的说法,换了个版本还真好了。
?
?
注意: 如果你现在用的是WSAD5.1.2,那么我不幸的告诉你我还没有研究出来。在WSAD5.1.2里存在一个包冲突的问题。原因是WSAD5.1.2加载的时候会加载一个javax.xml.namespace.QName这么个类,具体在哪个包里我没找到。然后axis2 1.3也会去加载这个类。但是WSAD5.1.2加载的一个老版本的QName,所以axis2 1.3用不起来就报一个 java.lang.NoSuchMethodError的错。网上有人说把类加载方式改成PARENT_LAST,我试过了不起作用。折腾了好长时间,由于时间是宝贵的我不想浪费到这个恶心的问题上就没去深入研究了。后来我用的是RAD 6,虽然这是个很恶心的IDE但是起码能让我顺利部署axis2。
?
在RAD6里你自己的工程下新建一个axis2的web项目,把下载下来的压缩文件解开后里面的东西很下面的文档结构导入到workspace里。
?
?
|-----WebContent |---------WEB-INF | |-----------conf | | |---------axis2.xml | |-----------lib(all jar) | |-----------modules | | | ---------addressing-1.3.mar | | |--------- ... | |-----------services | | |---------services.list | | |---------version.aar | |-----------web.xml |----------axis2-web
?
?然后将axis2.war模块添加到你的工程里就OK了!
?
3.开发服务器端web service
跟具需要总结出需要对外提供的service,然后建service。举个小例子
?
package com.cs.test; public class WSTest{ public String sayHello(String value) { System.out.println("Web Service HelloWorldService: " + value); //具体service的实现类 WSTestImpl wsimpl = new WSTestImpl(); wsimpl.doservice(); return value; } }
?
4.在工程下面新建一个文件夹META-INF ,并在其中建一个services.xml 内容如下:
<service> <parameter name="ServiceClass" locked="false"> com.cs.test.WSTest </parameter> <operation name="sayHello"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> </service>
5.web service打包 ? 将刚才开发的web service和META-INF中的services.xml选择导出,导出为jar。然后在路径里将文件名改成WSTest.aar ? 6.发布web service ? 浏览器里访问http://localhost:9080/axis2/?,里面的Administration。用户名为admin,密码为axis2。然后upload你的aar文件。正常情况会upload成功,然后返还home后点services会看到你发布的WSTest的web service。 7.集成axis2到你自己的web中。 在你自己的web.xml里加上axis2的servlet和servlet mapping的配置,然后在classpath里加入axis2的所以jar包就OK了! 8.生产客户端程序 ? 引用:StockQuoteService类创建客户端的四种方式: 构建基于AXIOM的客户端;使用Axis2 Databinding Frame work(ADB)生成客户端;使用XMLBeans生成客户端;使用JiBX生成客户端。 ADB:最简单的生成Axis客户端的方法。大部分情况下,这些主要的类都会以内部类的形式创建在stub类中。It is not meant to be a full schema binding application, and has difficulty with structures such as XML Schema element extensions and restrictions。 XMLBeans:与ADB不同,他是一个全功能的schema编译器。他没有ADB的限制。然而,他也比ADB用起来更复杂。他会产成大量的文件,编程模型不如ADB直观。 JiBX:他是一个数据绑定框架。他不仅提供了WSDL-JAVA的转换,而且提供了JAVA-XML的转换。JiBX相当灵活,允许你选择类来代表你的实体,但是这个却不好做,但还句话说,如果这些都能建好,那么使用JiBX就更使用ADB一样容易。 对于简单应用来说ADB已经够用了,如果想用更加强大更加灵活的功能,那么你可能需要使用其他两种方式。 ? ? ? ? 用CMD命令 进入到%AXIS2_HOME%/bin目录下运行: ? ? ? wsdl2java.bat -uri?http://localhost:9080/axis2/services/WSTest?wsdl?-o D:\ -p com.cs.test -d abd 将会在 D:\ 中生成一个src\com\cs\test包 ,将其中的两个JAVA (ExceptionException0.java和WSTestStub.java )拷导入到 另一个测试客户端的工程中进行测试. 我们需要建一个测试类来掉我们发布的web service,内容如下:
? ? ? 上面的操作在正常情况下可以正常运行,遇到特殊问题还要特殊对待。 ? ? ? ? ? 关于WSAD5.1.2包不兼容的问题已经找到解决方法了,更换WSAD5.1.2自身lib下有一个qname.jar的文件。次qname.jar里只有一个class,javax.xml.namespace.QName。但是版本比较老,里面有好多方法没有。下载个新版本的放在qname.jar里替换原来的就行了!不会影响内置WAS的启动。而且能解决部署问题。 qname.jar的路径为%WSAD_PATH%\WebSphere Studio\Application Developer\v5.1.2\runtimes\base_v51\lib ? ? ? ? ? ? ????????? ?
?
?