之前遇到过的问题,此次又一次出现,又一次花掉我好几个小时的调查(不顺手作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; }