servlet中的xpath查询给出了异常

时间:2012-06-21 20:56:42

标签: java servlets xpath thread-safety

我在servlet的init()方法中初始化了一个Document对象,并在doPost()方法中使用它来为请求提供服务。

selectNodeList()xpath查询在servlet同时为多个请求提供服务时给出异常。 例外情况如下所示:

Caused by: javax.xml.transform.TransformerException: -1
    at org.apache.xpath.XPath.execute(XPath.java:331)
    at org.apache.xpath.CachedXPathAPI.eval(CachedXPathAPI.java:328)
    at org.apache.xpath.CachedXPathAPI.selectNodeList(CachedXPathAPI.java:255)
    at org.apache.xpath.CachedXPathAPI.selectNodeList(CachedXPathAPI.java:235)
    at com.pro.bb.servlets.Controller.getDataOrPeriodForReport(Controller.java:511)
    ... 23 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
    at org.apache.xpath.XPathContext.pushCurrentNode(XPathContext.java:808)
    at org.apache.xpath.axes.PredicatedNodeTest.acceptNode(PredicatedNodeTest.java:447)
    at org.apache.xpath.axes.AxesWalker.nextNode(AxesWalker.java:409)
    at org.apache.xpath.axes.WalkingIterator.nextNode(WalkingIterator.java:176)
    at org.apache.xpath.axes.NodeSequence.nextNode(NodeSequence.java:320)
    at org.apache.xpath.axes.NodeSequence.runTo(NodeSequence.java:474)
    at org.apache.xpath.axes.NodeSequence.setRoot(NodeSequence.java:257)
    at org.apache.xpath.axes.LocPathIterator.execute(LocPathIterator.java:257)
    at org.apache.xpath.XPath.execute(XPath.java:308)

帮我解决问题。

2 个答案:

答案 0 :(得分:1)

CachedXPathAPI类不是线程安全的。如果您在servlet中使用它,则必须谨慎处理同步访问(或使用多个实例)。

来自Apache Xalan-j javadoc

  

请注意,任何特定的CachedXPathAPI实例都不能在没有同步的情况下由多个线程操作;我们目前不支持对单个DTM的多线程访问。同样,任何特定的CachedXPathAPI实例都不能在没有同步的情况下由多个线程操作。

答案 1 :(得分:0)

尝试Saxon。 Saxon文档实例和缓存的查询/样式表/ xpath表达式都是完全线程安全的。