4

ここにある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>

パッケージの登録が機能しない理由はまだ明らかではありません。

4

4 に答える 4

6

次の 2 つのことを行う必要があります。

  1. WriterInterceptor提供されたコード スニペットから、注釈で注釈が付けられているようには見えません@Compress。プロバイダーとリソース メソッドが一致していることを確認してください。
  2. Applicationプロバイダーを JAX-RSクラスに登録するか、 を介して登録する必要がありますweb.xml。ドキュメントはこれについて少し曖昧かもしれません (修正します)。
于 2013-11-01T13:31:16.103 に答える
5

次のように、Interceptor クラスにも注釈を付ける必要があります@Provider

@Provider
@Compress
public class GZIPWriterInterceptor implements WriterInterceptor { ...

これは、パッケージ スキャンで検出されます。

ここのドキュメントでは、明示的に指定していません。

于 2013-12-18T18:49:01.023 に答える
1

すべてのクラス (Compress、GZIPWriterInterceptor、HelloWorldResource) が、web.xml のパラメーター「jersey.config.server.provider.packages」で指定された同じパッケージの下にあることを確認してください。

@NameBinding が機能しないという状況が発生し、Compress を別のパッケージに配置したことがわかりました。

于 2015-01-17T06:09:14.937 に答える