基于axis 1.2 的web service 在weblogic 9.2 上发布时的一些问题解决方案

基于axis 1.2 的web service 在weblogic 9.2 上发布时的一些问题解决方案

在项目的开发中,项目与统一信息平台的接口采用web service交互,在接口开发过程中发生了以下两个问题,寻找解决方案非常耗时费力,现将解决方案记录,对大家或有帮助。
接口约束:
服务端接口依赖统一信息平台的web service接口,该接口由第三方软件供应商开发,采用JBuilder自带的axis辅助开发插件生成。

产生的问题:
1。丛apache网站下载的axis软件包,生成客户端,在访问服务器时,产生系列化格式错误。
解决:初时定位错误,可能因为服务端出错而导致xml系列化客户端java类时产生错误,后跟服务端开发商跟踪,服务端运行正常。
而且服务端开发商的测试用例采用我们的测试用例数据运行也正常。于是怀疑是环境问题。在拷贝服务端开发商环境中的jar包后,
重新生成客户端,一切正常。
结论:服务端开发商使用的axis版本过低。axis高版本不能兼容低版本。
2。客户端在tomcat5上调试通过,测试用例也在sun jdk 1.5_4运行通过。发布到suse9上安装的weblogic9.2上,访问服务器时产生
以下错误:
AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode:
 faultString: java.lang.NullPointerException
 faultActor:
 faultNode:
 faultDetail:
        {http://xml.apache.org/axis/}stackTrace: java.lang.NullPointerException
        at java.util.Hashtable.put(Ljava.lang.Object;Ljava.lang.Object;)Ljava.la
ng.Object;(Unknown Source)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.setProperty(SAX
ParserImpl.java:395)
        at weblogic.xml.jaxp.WebLogicSAXParser.setProperty(WebLogicSAXParser.jav
a:117)
        at weblogic.xml.jaxp.RegistrySAXParser.setProperty(RegistrySAXParser.jav
a:117)
        at org.apache.axis.encoding.DeserializationContextImpl.parse(Deserializa
tionContextImpl.java:246)
解决:根据以上错误,到google搜索错误产生的原因和解决方案,发现遇到此问题的人不少,其并有人声称axis 1.2rc1已经解决了此bug。
然而,现时已经无法下载axis 1.4以下的版本,当前使用的是JBuilder自带的axis包,不清楚版本。升级到axis 1.2rc1的解决途径已经无望。
仔细查看已经搜索的解决方案,其中sun的论坛上一个帖子如此说:
This exception is because of the Java 5 XML parsing changes.
问题出现在xml的解析上。而以上错误的解析器使用的是weblogic.xml.jaxp.WebLogicSAXParser。
查找错误中org.apache.axis.encoding.DeserializationContextImpl类中的解析方法parse,其中一句:
SAXParser parser = XMLUtils.getSAXParser();
表明解析器的产生由XMLUtils.getSAXParser()获得。

而XMLUtils类中,初始化解析器工厂的方法:
    static
    {
        log = LogFactory.getLog((class$org$apache$axis$utils$XMLUtils != null ? class$org$apache$axis$utils$XMLUtils : (class$org$apache$axis$utils$XMLUtils = class$("org.apache.axis.utils.XMLUtils"))).getName());
        empty = new String("");
        bais = new ByteArrayInputStream(empty.getBytes());
        initSAXFactory(null, true, false);
    }
    其中,initSAXFactory方法:
    public static void initSAXFactory(String factoryClassName, boolean namespaceAware, boolean validating)
    {
        if(factoryClassName != null)
            try
            {
                saxFactory = (SAXParserFactory)Class.forName(factoryClassName).newInstance();
                if(System.getProperty("javax.xml.parsers.SAXParserFactory") == null)
                    System.setProperty("javax.xml.parsers.SAXParserFactory", factoryClassName);
            }
            catch(Exception e)
            {
                log.error(Messages.getMessage("exception00"), e);
                saxFactory = null;
            }
        else
            saxFactory = SAXParserFactory.newInstance();
        saxFactory.setNamespaceAware(namespaceAware);
        saxFactory.setValidating(validating);
        saxParsers.clear();
    }
   
    从以上代码看出,axis的XMLUtils类取得解析器工厂的过程为:
    SAXParserFactory.newInstance()
    该方法的解释:
     newInstance
 
   public static SAXParserFactory newInstance()
 
     获取 SAXParserFactory 的一个新实例。此静态方法创建一个新的工厂实例,此方法使用下面有序的查找过程来确定要加载的 SAXParserFactory 实例类:
 
         * 使用 javax.xml.parsers.SAXParserFactory 系统属性。
         * 使用 JRE 文件夹中的属性文件 "lib/jaxp.properties"。此配置文件格式为标准的 java.util.Properties 且包含实现类的完全限定名,其中实现类的键是上述定义的系统属性。 JAXP 实现只读取一次 jaxp.properties 文件,然后缓存其值供以后使用。如果首次尝试读取文件时,文件不存在,则不会再次尝试检查该文件是否存在。首次读取 jaxp.properties 后,其中的属性值不能再更改。
         * 如果可以,使用 Services API(在 JAR 规范中进行了详细描述)来确定类名称。Services API 将查找在运行时可用的 jar 中 META-INF/services/javax.xml.parsers.SAXParserFactory 文件中的类名。
         * 平台默认的 SAXParserFactory 实例。
 
     在应用程序获取对 SAXParserFactory 的引用后,它可以使用工厂来配置和获取解析器实例。
    根源在此,将系统属性vax.xml.parsers.SAXParserFactory设置为org.apache.xerces.jaxp.SAXParserFactoryImpl(不使用weblogic的解析器工厂)
    运行后,一切正常了。
结论:axis低版本在jdk5中使用时,要使用旧版的xml解析器工厂。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值