需求背景:
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} 可選包擴展機制
後面就是比較順利的一 堆業務處理了
以上,望對你們有一定幫助!