1

groovlet 用のキャッチオール groovy スクリプトを使用しようとしています。これは私がしたことです

public class GroovletServletCatchAll extends GroovyServlet { 
    public URLConnection getResourceConnection(String name) throws ResourceException { 
        return super.getResourceConnection("CatchAll.groovy"); 
    } 
}

今、CatchAll.groovyファイルにコードがあると、エラーが発生します

jndi:/localhost/web_app/CatchAll.groovy: 1: 
Invalid duplicate class definition of class CatchAll. 
One of the classes is an explicit generated class using the class statement, 
the other is a class generated from the script body based on the file name. 

最初のクラスが生成されるのはなぜですか? 私のコードには他のクラスはありません。キャッチオール スクリプトと拡張サーブレットのみ。


これは、上記のエラーが発生した削除されたコードでした

  println """
  Hello, ${request.remoteHost}: ${new Date()}
  """

奇妙なことに、上記の句を削除するnew Date()と、最初のエラーはなくなり、CatchAll コンストラクターで stackOverflow が発生します (自分自身を呼び出し続けます)。

これは、ログで(他のトレースの中で)繰り返し見たものでした

    at groovy.lang.GroovyObjectSupport.<init>(GroovyObjectSupport.java:32)
    at groovy.lang.Script.<init>(Script.java:40)
    at groovy.lang.Script.<init>(Script.java:37)
    at CatchAll.<init>(CatchAll.groovy)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

ここにも同じ質問を投稿しました

4

2 に答える 2

0

奇妙な動作を解決するのに十分な深さまで踏み込むことはできませんでしたが、もっと簡単な解決策がありました。これを追加して、すべてのリクエストを単一のスクリプトに送信しました。

<init-param>
    <param-name>resource.name.replacement</param-name>
    <param-value>CatchAll.groovy</param-value>
</init-param>

<init-param>
    <param-name>resource.name.regex</param-name>
    <param-value>/.*</param-value>
</init-param>
于 2013-08-30T17:07:42.857 に答える
0

以前の回答を修正する必要があります。修正は、以前に投稿したコードの変更ではなく、2.4.3 から 2.3.9 へのダウングレードです。2.4.3 では、GroovyServlet 自体は正常に動作しますが、その setVariables、getScriptUri、getResourceConnection、および getScriptUriAsFile を拡張すると、指定された問題が発生しました。

さらに調査中です。

于 2015-08-24T15:49:23.137 に答える