websphere OSGi应用环境下服务调用saaj包加载问题分析报告
作者:bingjava
版权声明:本文为博主原创文章,转载请说明出处:。
今天业务部门的开发同事在客户现场部署系统时,出现了saaj类加载问题,本楼主经过一番java代码的翻阅,最终问题得到解决,在此进行记录。
故障情况说明
系统简称 | 基于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)