慎用AXIS2

慎用AXIS2

java,web services,axis,apache,web,xml,rpc

 

AXIS一直是我比较喜欢的开源产品,也成了开源世界WEB SERVICE实现的事实标准,但我一直是用的AXIS 1.x 版本,它一直工作的很好。

但最近有同事用AXIS2,却遇到了麻烦,从而也使我有些机会去了解AXIS2,但了解的同时,也对AXIS2(当前release1.0版,别把AXIS2后的2看成是版本号)大失所望,加了一些华而不实的东西,反而把系统搞得很复杂,源代码里也有不少BUG

AXIS2自带了Version.aar的示例,好象是返回一个STRING,可以运行,但用它的客户端工具自动生成的代码实在难看:

1、  为什么非得封装一个***Reponse, getMsg之类的参数和响应呢(使用ADB数据绑定)?在前面的版本中,生成的客户端使用起来就象是在本地一样(客户端代理完全实现了服务端接口/或说发布的方法签名完成一样),但现在却不是这样的,为了使用接口,你不得不生成一个封装类,再将你的参数设置进去,而返回时,又不得不从***Response中显示的获取返回值(好像有个叫get_return之类的方法),很是别扭。

2、  生成客户端时提供好几种数据绑定方式,但我认为没有一种有以前的简洁,花哨不实用。

3、  文档太简单了,真该花点时间写些像样的文档,最起码的,services.xmlDTDSchema总得有一份呀!

接下来我们发现,使用自定义参数(无非是自己写的POJO)的接口发布后无法设用成功,返回的异常信息:reader is null(大概),开始还以为名称空间映射的问题,我们的自定义参数似下面的代码:

package com.mudboy.model;

import java.sql.Date;

import java.sql.Timestamp;

public class Message implements java.io.Serializable

{

    private static final long serialVersionUID = 1L;

    private Date actidate;

    private Integer flight_no;

    private Timestampa_or_d;

    private String d_or_i;

    private String etd_time;

    private String atd_time;

private String eta_time;

 

    . . . .后面略去所有GetterSetter

}

经过一番网上搜索和改配置(几乎试了所有的选项)/代码之类的操作,还是没有找到答案,错误还是发生。最好只好跟它的代码了,过程我就不多说了,只说结果吧。

1、  错误发生在执行完要返回的路了,正准备将返回值序列化成SOAP消息。

2、  ADB的代码中,有BeanUtils(不知道后面有没有S),里面有getFullParser方法,也就是,在序列化过程就,要通过该方法拿到一个Reader,但该方法返回了null

3、  该方法里面写得有些粗糙,很多可能的问题都没有想到,比如说,上面的POJO,在返回时有些为null,这应该是很正常的,但代码却假设任何一个属性都不为null(直接调用value.toString()方法),导致了NullpointException,发生该异常后,未记任何日志,而是直接返回了null,导致客户端跟据异常查错不太方便。

4、  我们将我们的POJO改了改,对属性均做了初始化,使返回时每个属性都不为null,意外的时,我们还是没有成功。

5、  这次异常还是因为getFullParser返回了null,难道不止一次调用了该方法?跟进去!发现代码是递归调用,即对于每个属性,也调用了该方法,代码里也是一堆if/else if/之类的,对一些数据类型进行了处理,我发现在我们属性类型是Timestamp时返回了null……

6、  它的序列化返序列化算法效率也有问题。

 

上面的过程很明显表现也AXIS2是那么的不成熟不完善,代码BUG如此明显也是出人意料,本以为AXIS2应该有个飞跃(至少多实现了几个标准),但却没想到基石却如此不牢固,建议今后别在正式的项目中使用。

说到这,我又想起前段时间网上的一篇文章,大意也是说AXIS如何不好的话,说是一堆研究生写出来的,当时我并未在意,并一如既往的支持AXIS,直到昨天开始接触AXIS2,我的态度有了变化

 

你可能感兴趣的:(java开源)