axis2学习
??? 最近公司的项目要用到Axis2作为webservice框架,为了避免以后遗忘,记录一些自己平时遇到的问题,便于以后查阅: ??? 1.使用axis2一般不推荐使用standalone的方式部署webservice,通常采用的方式是:在%AXIS2_HOME%/webapp下执行ant,生成axis2.war,利用整个axis2.war中的内容进行二次开发。 新建一个Web Project,把axis2.war的目录结构及其文件拷贝到当前Project的WebRoot下。 ??? 2.对于一般的应用,除了需要关心services目录以外,其他目录可以暂且不管。services目录是配置自己开发的WebService的地方。要把某个自己写的类暴露为WebService,只需要在services建立一个aar包,里面有一个META-INF目录,这个目录里放置services.xml文件,指定哪些类被暴露为WebService。aar包里还可以放class文件(WebService类的实现)以及wsdl文件。如果有了wsdl文件,应用程序就不会根据??? services.xml指定的实现类生成wsdl,而是直接采用这个wsdl文件作为WebService的描述。 为了简单起见,可以只在aar包里放META-INF/services文件,实现类放在WEB-INF/class目录里。 ??? 3.axis2与spring的集成。有两种方法:a.在web.xml配置listener;b.仿照axis2的例子程序,实现Spring的LifyCycle,手动读取applicationContext.xml的方式。 ??? 第二种方法我试了很久,始终没有成功,可能与版本有关吧!公司项目用的jdk是1.4,axis2用的1.2(最新都1.5了),而且这个例子程序用的spring还是1.2版本的(太老了吧)。最终放弃了这种方法。 ??? 第一种方法网上很多资料,只是注意一下services.xml中的写法: ??? 不需要使用ServiceClass参数指定要发布成WebService的Java类,而是要指定在applicationContext.xml文件中的装配JavaBean的名称(SpringBeanName参数)。需要通过ServiceObjectSupplier参数指定SpringServletContextObjectSupplier类来获得Spring的ApplicationContext对象。 4.在web作为Axis1 的client(结合struts等框架),要添加saaj.jar包(里面主要包含了javax.xml.soap包)不用的话系统会自己搜索服务器如tomcat自带的soap解析包,这样就会报ImcompatibleClassChangeException的异常。 5.一个Axis2服务器端的方法返回类型为List(如List getAllUsers()),而用Axis1生成的客户端调用该方法时,如果返回的对象只有一个(即List.size()==0),这时在客户端强制将其转换为List时要报错。 例如List users = (List)client.getAllUsers();当client.getAllUsers()返回的对象个数为1时,该语句报异常,size超过一个时又正常) 6.Axis1生成的客户端不允许方法无参数,只是一个bug,但又无可奈何。 7.Axis2支持用JSR注解@WebService的方式发布服务(也叫POJO的方式)。方法是把要暴露为Web服务的类及其关联的类打成JAR包,放在WEB-INF/pojo下,修改axis2.xml,增加配置: <deployer extension=".jar" directory="pojo" class="org.apache.axis2.deployment.POJODeployer"/> 但Axis2本身不太建议用这种方式,他们任务用打aar包配置service.xml的方式更灵活。 8.通过wsdl生成server端的代码,用类似如下的命令: a.使用ADB的方式:WSDL2Java.bat -uri http://localhost:8080/axis2/services/HelloWorld?wsdl -o dir -ss -sd 生成的skeleton类就是我们需要在里面添加业务逻辑的类。 b.使用xmlbeans的方式:WSDL2Java.bat -uri http://localhost:8080/axis2/services/HelloWorld?wsdl -o xmlbind -ss -sd -d xmlbeans c.使用ADB的方式生成接口和一个具体实现类(这个实现类没有implements接口,如果要用需要自己加上implements)的ADB方式:WSDL2Java.bat -uri http://localhost:8080/axis2/services/HelloWorld?wsdl -o xmlbind -ss -sd -ssi 9.通过wsdl生成client端的代码: wsdl2java.bat -uri? http://localhost:8080/axis2/services/HelloWorld?wsdl -o client 生成的stub很复杂,不过可以不用仔细阅读和编辑stub的代码,我们只需要使用stub来调用远程的service,客户端编码示例: public class HelloClient { ??? public static void main(String[] args) throws Exception { ??? ??? HelloWorldStub stub = new HelloWorldStub(); ??? ??? HelloWorldStub.SayHi request = new HelloWorldStub.SayHi(); ??? ??? request.setName("Allen"); ??? ??? HelloWorldStub.SayHiResponse response = stub.sayHi(request); ??? ??? ??? ??? System.out.println(response.get_return()); ??? } } 10.在java中,有很多类型的包,如jar、war、ear、aar,其实他们都是zip格式的。但是如果通过winrar对services打包,然后再改成aar,会报错,可能是rar和zip格式不同吧!由于又不想用java -jar打包命令,可以利用现成的aar包,把包里的内容全部清掉,然后加上当前需要的内容,再修改前缀名即可。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |