0

サーブレットの init() メソッドで Document オブジェクトを初期化し、それを doPost() メソッドで使用してリクエストを処理します。

selectNodeList() xpath クエリは、サーブレットが同時に多くのリクエストを処理する場合に例外を発生させます。例外を以下に示します。

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)

問題を解決するのを手伝ってください。

4

2 に答える 2

1

CachedXPathAPIクラスはスレッドセーフではありません。サーブレットで使用している場合は、手動でアクセスを同期する (または複数のインスタンスを使用する) 必要があります。

Apache Xalan-j javadocから:

CachedXPathAPIの特定のインスタンスは、同期せずに複数のスレッドで操作してはならないことに注意してください。現在、単一のDTMへのマルチスレッド アクセスはサポートしていません。同様に、 CachedXPathAPIの特定のインスタンスは、同期せずに複数のスレッドで操作してはなりません。

于 2012-06-21T21:01:12.117 に答える
0

サクソンを試してみてください。Saxon ドキュメント インスタンスとキャッシュされたクエリ/スタイルシート/xpath 式はすべて完全にスレッド セーフです。

于 2012-06-22T06:56:01.277 に答える