2016-04-01 7 views
1

私のRSSサーブレットは、HttpServletResponseOutputStream 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と言う(ストリームを閉じると自動的に応答をコミットするようだ)。

outwriterの初期化をtryブロック外に移動してfinallyブロック(Java7以前の方法)で終了すると、エラーコードが正しく送信されます。

try-with-resourceを使い続け、例外の場合でもエラーコードを返すことができるかどうかは疑問でした。

ありがとうございます!

+1

あなたは_outer_ try-with-resourcesと_inner_ try-catchを使用できます。 – jtahlborn

答えて

1

自分で作成していないリソースを閉じる必要はありません。コンテナはその下にあるOutputStreamをすべて作成したため、それ自体がすべてそれを適切に閉じてしまう責任もあります。コンテナがすでにサーブレットのdoXxx()メソッドの周りにtry-with-resourcesを配置していることを視覚化する必要があります。またShould I close the servlet outputstream?

と違って、OutputStreamの中の試してみるリソース全体がdoXxx()の中にありません。

ちょうど行う:あなたが再スローあれば、具体的な問題へ


無関係

try { 
    // Generate RSS here 

    OutputStreamWriter writer = new OutputStreamWriter(response.getOutputStream(), "UTF-8")) { 
    response.setContentType("text/xml"); 

    // Write RSS here. 

} catch (SomeException e) { 
    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); 
} 
は、任意のは、コンテナは、すべて自身で適切な応答コードの世話をしてます、 ServletExceptionとして例外をチェックしますメッセージ。

try { 
    // ... 
} catch (SomeException e) { 
    throw new ServletException(e); 
} 
関連する問題