私のRSSサーブレットは、HttpServletResponse
のOutputStream out
のtry-with-resourceとそのライターを使用します。いくつかのケースではSomeException
は私がクライアントにHTTPステータス500を返す必要があり、その場合には、RSS文書を生成しながら、スローされます。try-with-resource vs java.lang.IllegalStateException:応答がコミットされた後にsendError()を呼び出すことができません
try (ServletOutputStream out = response.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(out, "utf-8")) {
response.setContentType("text/xml");
// Generate RSS here
} catch (SomeException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
return;
}
しかし、時間response.sendError()
によって呼び出され、$アウト$が既にされています閉じたと私は応答がすでにコミットされていると言ってIllegalStateException
と言う(ストリームを閉じると自動的に応答をコミットするようだ)。
out
とwriter
の初期化をtryブロック外に移動してfinallyブロック(Java7以前の方法)で終了すると、エラーコードが正しく送信されます。
try-with-resourceを使い続け、例外の場合でもエラーコードを返すことができるかどうかは疑問でした。
ありがとうございます!
あなたは_outer_ try-with-resourcesと_inner_ try-catchを使用できます。 – jtahlborn