2012-09-22 35 views
2

我试图在错误500根据请求的格式发生时在Grails中服务于不同的响应。Grails:如何根据格式(JSON,HTML)为错误500提供不同的响应?

我创建了一个ErrorController,我使用它在URLMappings但我没有得到正确的请求格式:

def handle() { 
    withFormat { 
     html { 
      response.status = 500 
      render(view:'/errors/serverError') 
     } 
     json { 
      response.setContentType "application/json; charset=utf-8" 
      response.status = 500 
      ApiResponse apiResponse = new ApiResponse(
       meta: new ApiMeta(
        code: 500, 
        errorType: "Whatever", 
        msgs: ["${request.exception}"] 
       ) 
      ) 
      render apiResponse as JSON 
    } 
    } 
} 

的反应总是在HTML中。还用'request.withFormat'尝试了相同的结果。

我在这里错过了什么?

+0

+1我一直在试图找出这一个为好;(另外我希望能够主题500页 – chrislovecnm

回答

1

我没有足够的信息来验证这是否是真正的原因,但它可能看起来像一个MIME类型的问题。在您的Config.groovy中,json是否正确配置为MIME类型?你的客户是否接受你的MIME类型。请参阅此链接参考http://grails.org/doc/2.1.0/guide/single.html#contentNegotiation

+0

JSON在Config.groovy中包含的MIME(Grails的2.1.1): JSON :['application/json','text/json'], 此外,我已经能够检测其他控制器操作中的格式 – chozero

+0

它的确与MIME类型有关,我不接受“Accept “header。我在Config.groovy中将'grails.mime.use.accept.header'更改为true,并且它可以工作。 – chozero

1

我不知道这是否可以解决您的问题...但尝试错误处理urlMapping中,你可以在http://grails.org/doc/latest/guide/theWebLayer.html#mappingToResponseCodes

看到你可以捕捉任何异常,从你的行动,并抛出当格式请求是JSON时,作为JSONException发生异常。

"500"(controller: "error", action: "handleJsonException", exception: JSONException) 
"500"(controller: "error", action: "handleHtmlException") 
+0

我试过这个解决方案,但它不起作用。为JSONException添加一个处理程序是可行的,但只有在捕获的异常是这种类型的,例如解析错误。 无论如何感谢:) – chozero