最近公司的项目要用到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包,把包里的内容全部清掉,然后加上当前需要的内容,再修改前缀名即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。