使用Groovlet重复类错误

时间:2013-08-27 18:14:14

标签: groovy groovlet

我正在努力为我的groovlets使用Catch-all 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. 

为什么第一堂课会被生成?我的代码中没有任何其他类。只有Catch-all脚本和扩展的servlet。


这是我得到上述错误的剥离代码

  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)

我也发布了同样的问题here

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

必须纠正我以前的答案:修复不是我之前发布的代码更改,而是从2.4.3降级到2.3.9。在2.4.3中,GroovyServlet本身工作正常,但扩展其setVariables,getScriptUri,getResourceConnection和getScriptUriAsFile确实导致了命名问题。

仍在进一步调查。