axis2学习

来源:互联网 发布:淘宝购物车登录 编辑:程序博客网 时间:2024/05/02 01:08

    最近公司的项目要用到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包,把包里的内容全部清掉,然后加上当前需要的内容,再修改前缀名即可。

原创粉丝点击