2012-06-21 83 views
0

我在servlet的init()方法初始化的文档对象,并用它在doPost()方法来服务请求。XPath查询给出异常

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) 

帮我理清问题。

+0

其中该文件宣布?如果它是你的servlet中的私有变量,我想你会遇到并发问题。 – Cygnusx1

+0

谢谢..所以,如何解决这个问题? – Arun

+0

同步对文档的访问。或者,也许最好在doPost() – Cygnusx1

回答

1

CachedXPathAPI类不是线程安全的。如果您在servlet中使用它,则必须手动注意同步化访问(或使用多个实例)。

Apache Xalan-j javadoc

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

+0

谢谢..有没有其他的替代方法来处理这种情况? – Arun

+0

我认为从XML提供数据是一个坏主意。您应该将XML转换为'init()'上的结构化Java对象,然后为该对象提供值,而无需对每个请求进行任何进一步的XML处理。 – npe

0

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