soap消息jdk版本問題導致報錯

需求背景:

1.

最近要開放一項融合業務受理接口,什麼是融合業務,簡單來說就是手機主副卡+寬帶混合產品在同一個賬戶交費;

這就遇到一個問題,就是6層的xml其中5層中是多對多的關係;如下:

xml結構:
---請求信息
	--產品信息(多個)
		--產品類型(多個)
			--構成包信息(多個)
				--元素信息(多個)
					--元素附加屬性(多個)
	--賬戶信息(一個)
		--組合賬戶信息(多個)
			--託收信息(多個)



對於一般的java系統來說這不是個問題,很易解決,然後把數據按邏輯入庫生成即可,但我們系統中用到了tuxedo中間件,這5層中是多對多的關係要通過tuxedo的字段給到我們後臺,問題就來了;


fml數組要傳這5次的xml數據這種情況我們不是第一次遇到,有比較成熟的轉爲我們內部的專用的數據構DataBufTux 在c++中是很方便可以像dom4j那個操作這些數據的,但問題就是在一個新的項目中加入原來我們那個套轉換算法要先把xml轉爲soap消息再轉爲我們內部的DataBufTux ; 


2.環境

測試主機用的是AIX 5.3.0.0  jdk最到只支持到IBM jdk1.6 程序一上來就報如下錯,怎麼會這樣,我本地運行好好的,用的也是jdk1.6  ,這個報錯是在string轉soap消息時報的

代碼:

MessageFactory mf = MessageFactory.newInstance();
SOAPMessage sm=mf.createMessage(null, new ByteArrayInputStream(reqStr.getBytes(Charset.forName("UTF-8"))));
報錯:
com.sun.xml.messaging.saaj.SOAPExceptionImpl: Unable to internalize message
        at com.sun.xml.messaging.saaj.soap.MessageImpl.init(MessageImpl.java:530)
        at com.sun.xml.messaging.saaj.soap.MessageImpl.<init>(MessageImpl.java:319)
        at com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl.createMessage(SOAPMessageFactory1_1Impl.java:74)
        at com.linkage.iboss.translator.IBSS.wo.SoapUtil.String2Buff(SoapUtil.java:35)
        at com.linkage.iboss.translator.IBSS.wo.MeMixBusinessCheckTranslator.convert2Fml(MeMixBusinessCheckTranslator.java:206)
        at com.linkage.iboss.translator.MessageParser.convertSvcCont2Fml(MessageParser.java:289)
        at com.linkage.iboss.translator.HomeMessageTranslator.convertSvcCont2Fml(HomeMessageTranslator.java:61)
        at com.linkage.iboss.convertor.IBOSSHomeConvertor.porecssReqData(IBOSSHomeConvertor.java:130)
        at com.linkage.uip.processor.ReqDataConvertCMD.execute(ReqDataConvertCMD.java:120)
        at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:166)
        at com.linkage.uip.processor.DefaultChain.execute(Unknown Source)
        at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:166)
        at com.linkage.uip.processor.DefaultChain.execute(Unknown Source)
        at com.linkage.uip.processor.CommonDataProc.process(Unknown Source)
        at com.linkage.uip.receiver.HTTPDataReceiver.doPost(HTTPDataReceiver.java:565)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3498)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(Unknown Source)
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
Caused by: java.lang.NoClassDefFoundError: com.sun.org.apache.xerces.internal.dom.DocumentImpl
...跳過...
com.sun.xml.messaging.saaj.SOAPExceptionImpl: Unable to internalize message
        at com.sun.xml.messaging.saaj.soap.MessageImpl.init(MessageImpl.java:530)
        at com.sun.xml.messaging.saaj.soap.MessageImpl.<init>(MessageImpl.java:319)
        at com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl.createMessage(SOAPMessageFactory1_1Impl.java:74)
        at com.linkage.iboss.translator.IBSS.wo.SoapUtil.String2Buff(SoapUtil.java:35)
        at com.linkage.iboss.translator.IBSS.wo.MeMixBusinessCheckTranslator.convert2Fml(MeMixBusinessCheckTranslator.java:206)
        at com.linkage.iboss.translator.MessageParser.convertSvcCont2Fml(MessageParser.java:289)
        at com.linkage.iboss.translator.HomeMessageTranslator.convertSvcCont2Fml(HomeMessageTranslator.java:61)
        at com.linkage.iboss.convertor.IBOSSHomeConvertor.porecssReqData(IBOSSHomeConvertor.java:130)
        at com.linkage.uip.processor.ReqDataConvertCMD.execute(ReqDataConvertCMD.java:120)
        at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:166)
        at com.linkage.uip.processor.DefaultChain.execute(Unknown Source)
        at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:166)
        at com.linkage.uip.processor.DefaultChain.execute(Unknown Source)
        at com.linkage.uip.processor.CommonDataProc.process(Unknown Source)
        at com.linkage.uip.receiver.HTTPDataReceiver.doPost(HTTPDataReceiver.java:565)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3498)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(Unknown Source)
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
Caused by: java.lang.NoClassDefFoundError: com.sun.org.apache.xerces.internal.dom.DocumentImpl
        at java.lang.ClassLoader.defineClassImpl(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:275)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:69)
        at weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:335)
        at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:288)
        at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:256)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:660)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:626)
        at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:176)
        at com.sun.xml.messaging.saaj.soap.SOAPPartImpl.<init>(SOAPPartImpl.java:113)
        at com.sun.xml.messaging.saaj.soap.ver1_1.Message1_1Impl.getSOAPPart(Message1_1Impl.java:90)
        at com.sun.xml.messaging.saaj.soap.MessageImpl.init(MessageImpl.java:410)
        ... 28 more
Caused by: java.lang.ClassNotFoundException: Class bytes found but defineClass()failed for: 'com.sun.org.apache.xerces.internal.dom.DocumentImpl'
        at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:262)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:660)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:626)
        at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:176)
        ... 40 more
Caused by: java.lang.UnsupportedClassVersionError: JVMCFRE003 主要版本錯誤;類=com/sun/org/apache/xerces/internal/dom/DocumentImpl,偏移量=6
        at java.lang.ClassLoader.defineClassImpl(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:275)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:69)
        at weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:335)
        at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:288)
        at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:256)
        ... 43 more


很明顯是運行時拋的java.lang.NoClassDefFoundError ,細看這肯定是jdk版本過低了,有些方法不支持之類的,看下IBM-jdk下jre的lib包rt.jar中是沒有com.sun.org.apache.xerces.internal.dom.DocumentImpl相關的類,一對比本地sun的這個rt.jar包,本地的是53M而IBM的是19M,明顯是少了不少東西,這個問題,升級個jdk可以輕鬆解決,但是...........


事實告訴我的想法太天真了,在ibm的jdk版本,aix5.3系統是不支持ibm-jdk7的,要想裝ibm-jdk7,必先升組aix系統到6.1以上,這個找ibm小型機的人做也不一定願意做,再加了這臺主機上還有測試+開發的oracle數據庫,mydql ,redis等,但不裝感覺又不支持,還有什麼招,哎心想爲什麼這個項目要部署在這臺主機上呢!!


想了很多辦法,替換相關jar包 , 把依賴的jar中的類加放到項目本地的class下,把相關新jar包放到本地項目的lib包下,但是,人家jdk加載過程中是優先加載自已的,認爲加載過了就不會再加載我放上去的了............................


然而,升組jdk好像是唯一解決的方法了但在網上看到了一個jdk參數

JVM系統屬性 java.endorsed.dirs 

{java.endorsed.dirs} 包升級替換機制,把相關依據包放到一個目錄如 /home/webapp/endorsed 在web啓動參數中加入-Djava.endorsed.dirs= /home/webapp/endorsed 

這個居然解決了........!  

後面查了還有個參數也挺有用的

{java.ext.dirs} 可選包擴展機制


後面就是比較順利的一 堆業務處理了


以上,望對你們有一定幫助!






















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章