2017-10-11 10 views
0

JavaサーブレットAPIは、バージョン3.0まではHttpServletResponseのgetStatusメソッドを提供しません。私は、HttpServletResponseWrappperを作成してHttpServletResponseをラップし、設定されているときにステータスをキャッチします。Jersey 2ステータスコードがHttpServletResponseWrapperに表示されない

これはJersey 2サーブレットでは機能しません。

私のHttpServletResponseWrapperは、私のフィルタのdoFilter(request、wrapperResponse)を介して渡されます。 Filterが呼び出されますが、Jersey RESTfulサーブレットがエンドポイントの場合はgetStatusメソッドは呼び出されません。

設定がありませんでしたか?

レスポンスビルダを使用して結果を返し、ステータスを設定します。

Response.status(404).build(); Response.status(200).type(mediaType).entity(theEntity).build();

よろしく ヨッヘン

+0

'HttpServletResponseWrapper'には何が必要ですか? –

+0

gzipフィルタのステータスコードを取得するには、404または204の応答にgzipヘッダーがありません。 – ScubaInstructor

答えて

0

あなたはGZIP圧縮のためHttpServletResponseWrapperは必要ありません。これは、JAX-RSからWriterInterceptorで達成することができます

public class GZIPWriterInterceptor implements WriterInterceptor { 

    @Override 
    public void aroundWriteTo(WriterInterceptorContext context) 
       throws IOException, WebApplicationException { 
     final OutputStream outputStream = context.getOutputStream(); 
     context.setOutputStream(new GZIPOutputStream(outputStream)); 
     context.proceed(); 
    } 
} 

次に、あなたのResourceConfig/ApplicationWriterInterceptorサブクラス登録:特定のリソースメソッドやクラスにインターセプターをバインドするには

@ApplicationPath("/api") 
public class MyApplication extends ResourceConfig { 

    public MyApplication() { 
     register(GZIPWriterInterceptor.class); 
    } 
} 

を、あなたは可能性がありname binding annotationsを使用してください。

+0

これは機能しています。そのWriterInterceptorは、エンティティを送信するとトリガされるので、404と204のケースが対象となります。しかし、リクエストにAccept-Encoding:gzip、deflate、brヘッダーがない場合、このgzipをスキップできますか? – ScubaInstructor

+0

@ScubaInstructor '@Context HttpHeaders httpHeaders'を使ってリクエストヘッダをインターセプタに注入できるはずです。 –

+0

このソリューションでは、EncodingFilter.enableFor(this、GZipEncoder.class、DeflateEncoder.class)を使用します。 WriterInterceptorをスキップします。 – ScubaInstructor

関連する問題