如何在ajax请求中处理grails异常?

Pal*_*alo 3 error-handling grails groovy

如果我正在进行常规请求,我可以在UrlMappings.groovy中定义错误和异常的处理,如下例所示:

    "403"(controller: 'error', action: 'index', params:['code':'403'])
    "404"(controller: 'error', action: 'index', params:['code':'404'])
    "500"(controller: 'error', action: 'index', params:['code':'500'])
    "500"(controller: 'home', action: 'noPrivileges', exception: IllegalOperationException)
Run Code Online (Sandbox Code Playgroud)

然后我可以处理特定控制器中的错误并呈现我选择的视图,例如

class ErrorController {

    def index = {
        render view: "/errors/myErrorPage", model: [code: params.code]
    }
}
Run Code Online (Sandbox Code Playgroud)

这非常有效,每当服务器出现错误时,我都会收到错误页面.

现在我如何才能为ajax请求实现完全相同的行为?我使用grails remoteFunctionformRemote进行ajax请求.每次在服务器上发生异常时,我都希望在javascript中执行相同的代码(例如,我想显示带警报的警报('有异常')).

上述方法不适用于ajax请求.我仍然收到错误,即使错误中有myErrorPage.gsp的内容,它也不会打印到我使用formRemote或remoteFunction的update参数指定的html元素中.

Pal*_*alo 6

我终于找到了一种完全干净的解决方案,与用于处理标准请求的方法兼容.

您需要修改处理错误的操作,如以下示例所示:

class ErrorController {

    def index = {
        if (request.xhr) {
             response.status = 200
             render template: "/errors/myAjaxErrorTemplate", model: [code: params.code]
        } else {
             render view: "/errors/myErrorPage", model: [code: params.code]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用request.xhr,您可以区分ajax请求和标准请求.在ajax请求中,您还需要通过将响应状态设置为200来告诉grails响应正常.

非常干净整洁.:)我很惊讶这不能用Google搜索任何地方......