前言:
在Axis1.X版本中,org\apache\axis\encoding\ser\BeanDeserializer这个类对于服务端返回的未知参数,采取的处理是抛出异常,中断程序;
而正确的代码逻辑(我们希望的)应该是:跳过,不作为;
这是Axis1.X一个bug,在Axis 2.0、.NET、X-fire等soap引擎中都不存在此问题
解决方法:
有两种方法:
1、 Axis 1.X官方版本的用户,可以直接使用下面的类 BeanDeserializer.class 替换Axis.jar 中 org\apache\axis\encoding\ser\ 目录下的同名类:
操作方法:
1) 停止运行环境;
2) 打开 Axis.jar 包,找到 org\apache\axis\encoding\ser\BeanDeserializer.class,将其备份;
3) 用上面提供的类替换 Axis.jar 中的同名类;
4) 重新起动运行环境,以使该类生效。
2、 手工修改类的方法(适用于Axis1.X):
1) 找到 Axis 的源代码;
编辑类 org\apache\axis\encoding\ser\BeanDeserializer.java,
2) 找到方法
public SOAPHandler onStartChild(String namespace,
String localName,
String prefix,
Attributes attributes,
DeserializationContext context)
throws SAXException
3) 找到如下代码:
<span style="color:#333333;">if (propDesc == null) {
// No such field
</span><span style="color:#ff0000;">throw new SAXException(
Messages.getMessage("badElem00", javaType.getName(),
localName));</span><span style="color:#333333;">
}</span>
4) 将 if 中抛出异常改为返回 null,如下:
<span style="color:#333333;">if (propDesc == null) {
// No such field
</span><span style="color:#ff0000;">return null;</span><span style="color:#333333;">
}</span>
5) 重新编译该类,用新的 BeanDeserializer.calss 类文件,重复方法1的执行步骤,使用新的类即可。