我们的一个 Web 应用程序已经在我们的生产环境中运行了很长时间,最近它在处理大量事务时遇到了一个奇怪的错误。我们无法弄清楚问题的根本原因是什么,但我们在之前的版本 WebSphere 6 中发现了一些类似的问题,这些问题与应用服务器使用的 Xalan 版本中的一个错误有关。我们的应用程序服务器实际上是 WebSphere 7,除了它不再使用 Xalan 之外,它应该已经修复了。我们的应用程序也没有嵌入 Xalan jar。要修复它,我们只需重新启动应用程序本身。一个重要的注意事项是文档正在被缓存 (docs.get(tableName)) 并被重用于执行 XPath 评估。我们这样做是为了避免每次解析文档的成本。
应用程序代码是
Document doc = null;
try {
doc = docs.get(tableName);
if (doc == null)
return null;
XPathFactory xFactory = XPathFactory.newInstance();
XPath xpath = xFactory.newXPath();
XPathExpression expr = xpath.compile(toUpper(xPathQuery));
Object result = expr.evaluate(doc, XPathConstants.NODESET);
return (NodeList) result;
} catch (XPathExpressionException e) {
logger.error("Error executing XPath", e);
}
错误堆栈在这里
javax.xml.transform.TransformerException: Unknown error in XPath.
at java.lang.Throwable.<init>(Throwable.java:67)
at javax.xml.transform.TransformerException.<init>(Unknown Source)
at org.apache.xpath.XPath.execute(Unknown Source)
at org.apache.xpath.jaxp.XPathExpressionImpl.evaluate(Unknown Source)
Caused by: java.lang.NullPointerException
at org.apache.xerces.dom.ElementNSImpl.getPrefix(Unknown Source)
at org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.processNamespacesAndAttributes(Unknown Source)
at org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.nextNode(Unknown Source)
at org.apache.xml.dtm.ref.DTMDefaultBase._nextsib(Unknown Source)
at org.apache.xml.dtm.ref.DTMDefaultBase.getNextSibling(Unknown Source)
at org.apache.xml.dtm.ref.DTMDefaultBaseTraversers$ChildTraverser.next(Unknown Source)
at org.apache.xpath.axes.AxesWalker.getNextNode(Unknown Source)
at org.apache.xpath.axes.AxesWalker.nextNode(Unknown Source)
at org.apache.xpath.axes.WalkingIterator.nextNode(Unknown Source)
at org.apache.xpath.axes.NodeSequence.nextNode(Unknown Source)
at org.apache.xpath.axes.NodeSequence.runTo(Unknown Source)
at org.apache.xpath.axes.NodeSequence.setRoot(Unknown Source)
at org.apache.xpath.axes.LocPathIterator.execute(Unknown Source)
... 16 more
这是我提到的类似问题。 http://www-01.ibm.com/support/docview.wss?uid=swg1PK42574
塔肯斯。