之前遇到過的問題,此次又一次出現,又一次花掉我好幾個小時的調查(不順手作mome的惡果)apache
環境:
Linux
Oracle Service Bus 11.1.1.9
Oracle WebLogic Server 10.3.6
jdk1.7.0_79oracle
問題:
在利用osb的custom bean接口,編輯XmlObject時,同一線程用兩次setTextValue方法,會莫名其妙的報空指針異常。spa
代碼:線程
public static XmlObject updateParamItems(XmlObject xmlObj, String... updItems) throws MyException { XmlCursor cursor = null; try { cursor = xmlObj.newCursor(); for (String item : updItems) { String itemName = item.split(":")[0]; String itemVaule = item.split(":")[1]; cursor.toFirstChild(); cursor.selectPath("/params/" + itemName); if (cursor.hasNextSelection()) { cursor.toNextSelection(); cursor.setTextValue(itemVaule);//<-就這,第二次執行時會出空指針異常 } cursor.toParent(); } } catch (Throwable ex) { throw new MyException("segmentFault", ex); } finally { if (cursor != null) { cursor.dispose(); } } return xmlObj; }
結論:
我推斷的緣由是apache的xmlbeans包的版本問題,oracle產品內有這個包,並且優先度大於我放在osb的lib下的包,最重要是版本不明,
更新這個包的方法不明,oracle官方還沒給解釋(絕對是他們碼代碼時碼的不講究)。
沒有直接解決,而是繞過了問題的根源,不是直接改值,而是把整個tag刪掉,而後直接值和tag一塊兒插入就沒事了。指針
代碼:code
public static XmlObject updateParamItems(XmlObject xmlObj, String... updItems) throws MyException { XmlCursor cursor = null; try { cursor = xmlObj.newCursor(); for (String item : updItems) { String itemName = item.split(":")[0]; String itemVaule = item.split(":")[1]; cursor.toFirstChild(); cursor.selectPath("/params/" + itemName); if (cursor.hasNextSelection()) { cursor.removeXml(); cursor.insertElementWithText(itemName, itemVaule); } cursor.toParent(); } } catch (Throwable ex) { throw new MyException("segmentFault", ex); } finally { if (cursor != null) { cursor.dispose(); } } return xmlObj; }