1

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 はエンティティ エクストラクタであり、応答を閉じません。

4

0 に答える 0