【问题标题】:How to handle grails exceptions in an ajax request?如何处理 ajax 请求中的 grails 异常?
【发布时间】:2012-08-31 12:29:40
【问题描述】:

如果我发出常规请求,我可以在 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)

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

class ErrorController {

    def index = {
        render view: "/errors/myErrorPage", model: [code: params.code]
    }
}

这很好用,只要服务器上出现错误,我就会得到错误页面。

现在我怎样才能为 ajax 请求实现相同的行为?我正在使用 grails remoteFunctionformRemote 发出 ajax 请求。每次服务器发生异常时,我都想在 javascript 中执行相同的代码(例如,我想用 alert('There was an exception') 显示警报)。

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

【问题讨论】:

    标签: grails groovy error-handling


    【解决方案1】:

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

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

    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]
            }
        }
    }
    

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

    非常漂亮和干净。 :) 我很惊讶这不能在任何地方用谷歌搜索...

    【讨论】:

      【解决方案2】:

      remoteFunction 触发了几个事件onFailureon_ERROR_CODE。您可以使用该事件来显示警告消息。

      您可以在docs查看更多详情

      【讨论】:

      • 感谢您的回答,但这不是我要问的。这样我必须在我的代码中修改每个 formRemote 和 remoteFunction。但这还不是这种方法最糟糕的缺点。它也不允许我根据服务器抛出的异常类型采取不同的行动。知道我怎么能做到这一点吗?
      • 是的,你可以,on_ERROR_CODE 是你用你的错误替换 _ERROR_CODE 的事件,例如on500(alert('That was a big error'))、on404(alert('Error 404')) 等。你可以创建一个javascript函数并传递代码 on500(myFunction('500')) on404(myFunction( '404'))。也许您可以使用 jQuery 来注入该代码。
      • 是的,但我想根据异常类型而不是错误代码类型显示消息。我所有的异常都有相同的错误代码 500。
      • 你需要查看 jQuery 文档:api.jquery.com/jQuery.ajax 有一个 error 参数,它是一个具有三个参数的函数,第三个参数是 errorThrow。我不是 jQuery 专家,但我想你可以在这里找到你的解决方案。
      【解决方案3】:

      如果请求状态设置正确,您可以通过remoteFunction/formRemoteonFailure 属性定义一个JavaScript 函数。

      在这个函数中,你可以在客户端处理你的异常。

      使用文档中的示例,它可能看起来像这样:

      <select onchange="${remoteFunction(action: 'bookByName',
                             update: [success: 'great', failure: 'ohno'],
                             params: '\'bookName=\' + this.value'),
                             onFailure: 'handleError'}">
          <option>first</option>
          <option>second</option>
      </select>
      

      【讨论】:

      • 感谢您的回答,但这不是我要问的。这样我必须在我的代码中修改每个 formRemote 和 remoteFunction。但这还不是这种方法最糟糕的缺点。它也不允许我根据服务器抛出的异常类型采取不同的行动。知道我怎么能做到这一点吗?
      • 在您的 JavaScript 函数 handleError 中,您可以像 function handleError(response) {alert(reponse.status)} 一样访问您的回复的 status - 这样您就可以单独处理每个状态...
      猜你喜欢
      • 2021-08-31
      • 2011-02-26
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多