ここにあるJersey 2.3 Interceptorの例をTomcat 7と名前バインディングを使用して動作させようとしています。リンクに示されている例に従って、次を作成しました...
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface Compress{}
と
@Compress
public class GZIPWriterInterceptor implements WriterInterceptor {
@Override
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
final OuputStream outputStream .....
..some logging added here..
}
と
@Path("helloword")
public class HelloWorldResource {
@GET
@Path("to-much-data")
@Compress
public String getVeryLongString(){
String str = "a very ...
..... large string";
return str;
}
}
インターセプターを登録するために web.xml に何も追加していないのは、これがユーザー ガイドのドキュメントで説明されていないためです。これは、以前のバージョンのジャージーで使用されていた方法であることに注意してください。
ジャージー クライアント API から構築されたクライアントを使用して、圧縮インターセプターが機能するかどうかをテストしました。リクエストを送信する前に、HttpHeaders.ACCEPT_ENCODING, "gzip"
ヘッダーが に追加されていることを確認しました。Invocation.Builder
にもロギングを追加しましたGZIPWriterInterceptor
。応答が圧縮されているかどうかをテストすると、プレーン テキスト (応答ヘッダーに設定されている) で返され、ログContent-Type - text/plain
にメッセージが表示されません。GZIPWriterInterceptor
私が間違っていることや、他に何を試すことができるか、誰かが考えていますか?
編集- web.xml を更新して、GZIPWriterInterceptor クラスの登録を試みました。
......
.
<servlet>
<servlet-name>Jersey Test Servlet</servlet-name>
<servlet-value>org.glassfish.jersey.servlet.ServletContainer</servlet-value>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.test.jersey</param-value>
</init-param>
<init-param>
<param-name>com.ws.rs.ext.WriterInterceptor</param-name>
<param-value>com.test.jersey.GZIPWriterInterceptor</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
.
.......
これはうまくいきませんでした。GZIPWriterInterceptor を WriterInterceptor などのパラメーター名で登録する必要がありますか?
更新- javax.ws.rs.core.Application を拡張し、必要な各クラス (HelloWorldResource.class、GZIPWriterInterceptor.class、Compress.class) を Deployment Agnostic Application Model で説明されているように登録することで、圧縮を機能させることができました。ここにあります。
Application クラスを web.xml に登録しました...
<display-name>JerseyInterceptorTest2</display-name>
<servlet>
<servlet-name>Jersey Rest Test</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.jersey.test.MyApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Rest Test</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
例 4.2 に従って ResourceConfig を拡張してパッケージを登録しようとしましたが失敗しました。以前の方法で web.xml を介して
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.test.jersey</param-value>
</init-param>
パッケージの登録が機能しない理由はまだ明らかではありません。