10

フォームの送信に応答するための単純なサーブレットを作成しています。このサーブレットはPOSTリクエストを受信し、Application/JSONデータに応答する必要があります。これはうまく機能しています。ここで、サーブレットにエラー管理を追加します。サーブレットが不正なリクエストパラメータを受信した場合、クライアントに400 —「不正なリクエスト」応答と単純な{"error":"ERROR MESSAGE"}JSON応答を応答させます。

を使用しHttpServletResponse#sendError(int,String)てエラーを正しく送信していますが、以前に使用した場合でもContentType、応答のは常にに設定されています。text/htmlHttpServletResponse#setContentType("application/json")

これは、Servetsを使用してエラーを送信するための良い方法ですか?ContentType応答を強制するにはどうすればよいapplication/jsonですか?

テストサーブレットの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);
}
4

3 に答える 3

29

最近、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他の何かがこのフィルターの前にヘッダーを設定したり、コンテンツを書き込んだりした場合に備えてありますか。

于 2014-09-26T15:58:45.260 に答える
5

それは指定どおりに機能します

指定されたステータスを使用してクライアントにエラー応答を送信し、バッファをクリアします。サーバーはデフォルトで、指定されたメッセージを含むHTML形式のサーバーエラーページのように見える応答を作成し、コンテンツタイプを「text/html」に設定します。

HttpServletResponse.sendError(int)

一方、この制限/機能はありません。

指定されたステータスコードを使用し、バッファをクリアして、クライアントにエラー応答を送信します。

つまり、コンテンツタイプを設定し、バッファに書き込み、を呼び出しますsendError(400)

于 2013-01-22T13:07:09.673 に答える
1

response.sendError(int)を呼び出す代わりに、response.setStatus(int)を使用します。

于 2013-07-17T21:26:13.607 に答える