我创建了一个servlet过滤器,现在无论在哪里抛出异常-原因始终是过滤器类。
我正在使用request.exception在ErrorController中检索异常类。
Stacktrace :
java.lang.RuntimeException:
在my.MyController $ _closure4.doCall( MyController.groovy:68 )
...
在my.MyFilter.doFilter( MyFilter.groovy:38 )
...
在java.lang.Thread.run(Thread.java:745)
我无法获得异常的真正原因:/

那么,为什么request.exception.getClassName()返回 MyFilter 而不是 MyController

MyFilter:

@CompileStatic

MyFilter类实现Filter {
UrlMappingsHolder grailsUrlMappingsHolder
MyService myService

@Override
void init(FilterConfig filterConfig) throws ServletException {

}

@Override
void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    String url = ((HttpServletRequest)servletRequest).getServletPath()
    def urlInfo = grailsUrlMappingsHolder.match(url).getParameters()
    if (!myService.controllersToNotCheck.contains(urlInfo.controller) && !myService.sourcesExist()) {
        throw new NoEnvironmentException()
    }
    filterChain.doFilter(servletRequest, servletResponse)
}

@Override
void destroy() {

}

}

最佳答案

谢谢你们的帮助。
问题如下:
Grails使用GrailsWrappedRuntimeException类包装异常;
此解析堆栈跟踪,并查找扩展名为.groovy的文件的最后一次出现。
MyFilter始终是stacktrace中的最后一个常规类(如果从顶部到底部读取),这就是为什么className始终为MyFilter的原因,因此它隐藏了有关引发异常的 Controller 或服务的信息。
我的解决方案很简单:我将过滤器重写为“MyFilter .java ” :)

关于grails - Grails:使用servlet过滤器时,异常className不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34949631/

10-15 13:41