我正在努力为我的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
答案 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确实导致了命名问题。
仍在进一步调查。