如何从Grails中的AJAX错误回调中检索错误消息?

时间:2010-08-05 22:03:24

标签: jquery ajax grails error-handling http-status-codes

我发送以下AJAX请求:

$.ajax({ type: 'POST',
  data: $(this).parents('form:first').serialize(), url:'/myapp/comment/saveOrUpdate',
  success: function(data,textStatus) {insertNewComment(data)},
  error: function(xhr, textStatus, errorThrown) {alert(xhr.responseText);}
})

...我的控制器动作如下所示:

class CommentController {
...
def saveOrUpdate = {
   ...
   if (error) {
      response.sendError 419, 'You must wait at least 5 minutes before posting a new comment'
   }
}}

不幸的是,我从来没有看到我在HTTP响应中发送的消息。相反,我得到了一个从Tomcat / Apache(或Grails?)生成的错误HTML页面,如下所示:

<html><head><title>Apache Tomcat/6.0-snapshot - Error report</title>
</head><body><h1>HTTP Status 419 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>Cannot find message associated with key http.419</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/6.0-snapshot</h3></body></html>

如何绕过生成的错误HTML页面,以便从JavaScript代码中检索消息“你必须等待......”?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您正在设置HTTP状态错误,但实际上您正在捕获业务逻辑问题 - 应用程序错误。为什么不设置适当的应用程序级状态代码和消息(由您自己设计),并返回ajax响应中的那些(包括剩余时间)?如果您依赖于HTTP错误代码,则可能会在不同的浏览器中获得不同的结果,如果错误页面小于512字节,其中一些浏览器会劫持错误消息。

在您引用的情况下,Apache找不到与419匹配的已知错误消息。

您可以在.htaccess配置中添加一个:

ErrorDocument 419 /errordocs/419.html

...然后让419.html页面说出你喜欢的任何内容(并确保页面超过512字节)。但我敢打赌,使用应用程序级状态代码正是您所需要的。