2012-09-22 44 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

相關問題