websphere OSGi应用环境下服务调用saaj包加载问题分析报告
Posted 基础架构技术栈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了websphere OSGi应用环境下服务调用saaj包加载问题分析报告相关的知识,希望对你有一定的参考价值。
故障情况说明
系统简称 | 基于osgi业务应用系统 |
故障名称 | 系统在客户生产环境:websphere7.0,基于osgi的应用系统,外部系统调用本系统提供的webservice服务时发生SOAPMessageFactory类加载异常,导致webservice服务不能被正常调用。 |
故障功能点 | Webservice服务 |
关键异常 | Caused by: java.lang.NoClassDefFoundError: com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl (initialization failure) ????at java.lang.J9VMInternals.initialize(J9VMInternals.java:140) ~[na:1.6.0] ????at java.lang.J9VMInternals.newInstanceImpl(Native Method) ~[na:1.6.0] ????at java.lang.Class.newInstance(Class.java:1345) ~[na:1.6.0] ????at javax.xml.soap.FactoryFinder.newInstance(FactoryFinder.java:70) ~[na:1.6.0] ????at javax.xml.soap.FactoryFinder.find(FactoryFinder.java:109) ~[na:1.6.0] ????at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:119) ~[na:1.6.0] ????at org.apache.cxf.binding.soap.saaj.SAAJInInterceptor.getFactory(SAAJInInterceptor.java:88) ~[cxf-bundle-minimal-2.2.9.jar:2.2.9] ????at org.apache.cxf.binding.soap.saaj.SAAJInInterceptor.handleMessage(SAAJInInterceptor.java:100) ~[cxf-bundle-minimal-2.2.9.jar:2.2.9]。 |
影响范围 | 本系统提供的webservice功能外部无法调用。 |
故障发生时间 | 2016-02-18 16:31:34.608 |
故障级别 | 严重 |
?
分析及解决
在调用服务,cxf处理消息时,会通过此抽象类javax.xml.soap.MessageFactory加载此MessageFactory的实现类,加载逻辑是:
- 从System.getProperty("javax.xml.soap.MessageFactory")获取指定的实现类。
- 如从第一步未取到则从java_home/lib/ jaxm.properties属性文件中取javax.xml.soap.MessageFactory项的配置。
- 如以上两步取到,则在当前classloader加载的非系统jar文件中(META-INF/services/javax.xml.soap.MessageFactory)
- 如以上方式都未取到,则默认加载:com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl类
com.sun.xml.internal.*包是sun jdk提供的一个默认实现,在提供webservice的工程中,需要引用saaj的相关包,并根据中间件环境来加载此类配置文件:
如websphere环境下可采用以下配置:
????websphere_ws.context.properties
javax.xml.soap.MessageFactory=com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl
而weblogic环境则:
????weblogic_ws.context.properties
javax.xml.soap.MessageFactory=com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl
????在业务系统初始化、启动时,根据中间件加载以上文件,并读取其配置将其设置到系统属性中:System.setProperty(key,value)
以上是关于websphere OSGi应用环境下服务调用saaj包加载问题分析报告的主要内容,如果未能解决你的问题,请参考以下文章
osgi应用使用桥接的方式打成war包部署在websphere上时遇到的与cxf相关的问题