Resteasy フレームワークを使用して Web サービスを記述します。
サーバーでの処理中に例外がスローされた場合、HTTP 500 応答でエラー メッセージをクライアントに送信する必要があります。
私は WebService インターフェイスに void メソッドを持っています:
public interface WebLocationService {
@DELETE
@Path("/delete")
@Consumes(MediaType.APPLICATION_JSON)
public void deleteLocation(LocationId locationId); { }
このメソッドが何らかの例外をスローすると、ExceptionMapper はそれをキャッチし、エンティティとして 500 ステータスと例外メッセージを含む応答を返します。
public class WebApplicationExceptionMapper implements
ExceptionMapper<WebApplicationException>{
@Override
public Response toResponse(WebApplicationException e) {
return Response.serverError().entity(e.getMessage()).build();
} }
Resteasy クライアント プロキシ フレームワークの使用。
ステータスが 500 のレスポンスの場合、クライアント プロキシ フレームワークは ServerErrorException をスローし、レスポンスをラップします。ServerErrorException から応答を取得します。応答で readEntity または getEntity を呼び出すと、IllegalStateException で応答クローズ エラーがスローされます。
デバッグして調べたところ、Web サービス インターフェイス メソッドの戻り値の型に基づいて、プロキシ フレームワークが EntityExtractor を決定します。
1) void 戻り型の場合、DefaultEntityExtractor$3 はエンティティ入力ストリームをバッファリングしてから、応答を閉じます。
2) Response、Response.Status、ResponseObject の場合、DefaultEntityExtractor$1,$2,$4 はレスポンスを閉じません。
3)その他のタイプの場合、BodyEntityExtractor はエンティティ エクストラクタであり、応答を閉じません。