2013-01-22 31 views
4

我現在創建一個簡單的Servlet來回答表單子表單。這個servlet接收POST請求並應該響應Application/JSON數據。這很好。 我現在想要將錯誤管理添加到我的servlet中:如果servlet接收到錯誤的請求參數,我希望它通過簡單的{"error":"ERROR MESSAGE"} JSON響應來回答客戶端400 - 「錯誤請求」響應。HttpServletResponse#sendError如何更改ContentType

我使用HttpServletResponse#sendError(int,String)來正確發送錯誤,但ContentType的響應始終設置爲text/html,即使我以前使用HttpServletResponse#setContentType("application/json")

這是使用Servets發送錯誤的好方法嗎?我怎樣才能強制ContentType的迴應application/json

編輯:我測試的Servlet的doPost()方法的示例代碼:

public void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("application/json;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     out.print("{\"error\":1}"); 
     response.sendError(HttpServletResponse.SC_BAD_REQUEST); 
} 

回答

2

這一工程as specified

使用指定的地位和 清零發送錯誤響應到客戶端緩衝區。服務器默認創建對 的響應,看起來像包含指定的 消息的HTML格式的服務器錯誤頁面,將內容類型設置爲「text/html」。

HttpServletResponse.sendError(int) 
,另一方面

沒有此限制/功能。

使用指定的狀態碼 向客戶端發送錯誤響應並清除緩衝區。

這意味着:設置內容類型,寫入緩衝區,調用sendError(400)

+0

感謝您的快速回復! 我嘗試了你的解釋。不知道如果做得好,因爲它沒有按預期工作。 :( 不確定關於「寫入緩衝區」部分我編輯了第一篇文章,其中包含我用於測試目的的代碼示例 – pdegand59

+0

這不適用於我sendError會忽略之前寫的任何內容 –

0

不是調用response.sendError(int),而是使用response.setStatus(int)。

+0

這不會在JBoss/WildFly中觸發錯誤頁面配置 – agilob

8

我最近有這個問題,當想要發送JAX-RS應用程序內的錯誤消息。根據規範,sendError將始終返回text/html。我必須做到以下幾點,給定一個HttpServletResponse response

response.resetBuffer(); 
response.setStatus(HttpServletResponse.SC_FORBIDDEN); 
response.setHeader("Content-Type", "application/json"); 
response.getOutputStream().print("{\"errorMessage\":\"You can't use this!\"}") 
response.flushBuffer() //marks response as committed -- if we don't do this the request will go through normally! 

的flushBuffer是至關重要的,以紀念響應,承諾,如sendError一樣。起初我只是試着在輸出流上調用close,但是會發生什麼,我的過濾器會運行,然後JAX-RS資源會繼續正常運行,然後我會得到錯誤消息和正常響應連同200狀態碼!

resetBuffer是否存在以防萬一其他情況在此過濾器之前設置了標題或寫入了一些內容。

相關問題