对于AJAX错误,URLMappings.groovy中的Grails异常处理

时间:2013-11-11 17:05:02

标签: ajax grails exception-handling

我有一个Grails应用程序,它向后端服务器发出HTTP请求以获取它的数据。该服务器可以被删除以进行维护,当发生这种情况时,它将向HTTP响应中的Grails应用程序返回“站点关闭”消息。 Grails应用程序正在检测此并抛出自定义的SiteDownException。在URLMappings.groovy中,然后将其定向到特定的错误页面。

除AJAX请求外,它的效果很好。似乎发生的是,“网站关闭”URL映射被触发(如预期的那样),然后是catch all'500'映射。

URLMappings.groovy

"500"(controller: "error", action: "siteDown", exception: SiteDownException)
"500"(controller: "error", action: "error500") 

ErrorController.groovy

def siteDown() {
println ">>>> site down <<<<"
}

def error500() {
println ">>>> 500 <<<<"
}

使用

抛出错误
throw new SiteDownException()

对于常规请求,堆栈跟踪显示...

[11/11/13 16:52:50.945 error] SiteDownException occurred when processing request: [POST] /portal/contact/detail - parameters:
fileKeyIdentifier: 
mode: add
Stacktrace follows: [org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver  http-bio-8080-exec-6]
com.ui.exceptions.SiteDownException
    at com.ui.backend.Backend$$EOMu30qx.getResponse(Backend.groovy:118)
    at com.ui.backend.Backend$$EOMu30qx.getResponseAsDomainObject(Backend.groovy:41)
    at com.ui.contact.ContactService.detail(ContactService.groovy:166)
    at com.ui.contact.ContactController.detail(ContactController.groovy:87)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
>>>> site down <<<<

点亮,但是对于AJAX请求......

    [11/11/13 16:54:09.380 error] SiteDownException occurred when processing request: [POST] /portal/contact/searchBody
Stacktrace follows: [org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver  http-bio-8080-exec-7]
com.ui.exceptions.SiteDownException
    at com.ui.backend.Backend$$EOMu30qx.getResponse(Backend.groovy:118)
    at com.ui.backend.Backend$$EOMu30qx.getResponseAsDomainObject(Backend.groovy:41)
    at com.ui.contact.ContactService.searchBody(ContactService.groovy:55)
    at com.ui.contact.ContactController.searchBody(ContactController.groovy:23)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
>>>> site down <<<<
>>>> 500 <<<<

最后一位是密钥 - 它显示来自siteDown操作的“site down”消息,以及来自catch all error500操作的“500”。

任何人都可以帮忙解释为什么两个映射都被调用了AJAX错误?感谢

1 个答案:

答案 0 :(得分:0)

我发现了问题。我在jQuery AJAX包装器中有一个错误陷阱:

error: function(XMLHttpRequest,textStatus,errorThrown){
     window.location.href = config.contextPath + '/error/error500'; // Error - show the 500 error page
}

因此,SiteDownException正确触发了SiteDown映射,然后AJAX错误处理程序触发了error500映射。