2013-07-25 4 views
5

私はRestEasy + Java EEアプリケーションを持っています。コンポーネントクラスに@GZIPを追加すると、クライアントが "accepts:gzip"を送信した場合、server-answerがgzipされます。Resteasyは一般的にGZIPを有効にします

一般的にすべてのコンポーネントに対してgzipを有効にする方法はありますか?私はすべてのクラスに注釈を追加するのは好きではありません。

私はRESTEasyのJAX-RS

答えて

0

ありません3.0.1を使用している、すべてのリソースについてはgzipを有効にするには、注釈を持つ方法はありません。注釈をすべてのクラスに追加することを避けたい場合は、受信ヘッダを見て、途中で応答をgzipするサーブレットフィルタを作成することができます。

0

カスタムJAX-RS 2.0フィルタとインターセプタでこれを行うことができます。また、これはどのようにすれば特に難しいことでもありません。

何をする必要がありますが、それはエンコードをサポートするために存在する注釈にないチェックを行いますので、それが唯一のAccept-Encodingヘッダを探しGZIPのため、既存のものを変更するフィルタを追加しています。 RESTEasyのGZIPエンコーディングが実装されている方法で

ルック: https://github.com/resteasy/Resteasy/tree/master/jaxrs/resteasy-jaxrs/src/main/java/org/jboss/resteasy/plugins/interceptors/encoding

あなたはは常にが存在注釈に関係なく、GZIPフィルタを追加する方法configure(ResourceInfo resourceInfo, FeatureContext configurable)を持っている機能を追加する必要があると思います。カスタムフィルタを登録するフィーチャと、クライアント用のフィーチャが必要です。

これらのものを使用すると、既存のGZIPインターセプタになるはずです。

私はカスタム圧縮フィルタを作成するために同様のメカニズムを使用しましたが(範囲を限定するために注釈によって適用されるように設定しましたが)。

4

@BobMcGeeに同意すると、すべてのリクエストを圧縮する独自のDynamicFeatureを作成できます。ここではすべての要求を圧縮するサンプルコードは次のとおりです。

import static java.util.Arrays.asList; 

import java.util.HashSet; 

import javax.ws.rs.ConstrainedTo; 
import javax.ws.rs.RuntimeType; 
import javax.ws.rs.container.DynamicFeature; 
import javax.ws.rs.container.ResourceInfo; 
import javax.ws.rs.core.FeatureContext; 
import javax.ws.rs.ext.Provider; 
import javax.ws.rs.ext.WriterInterceptor; 

import org.jboss.resteasy.plugins.interceptors.encoding.ServerContentEncodingAnnotationFilter; 

@Provider 
@ConstrainedTo(RuntimeType.SERVER) 
public class CompressionFeature implements DynamicFeature { 

    private WriterInterceptor compressionFilter = new ServerContentEncodingAnnotationFilter(new HashSet<>(asList("gzip"))); 

    @Override 
    public void configure(ResourceInfo resourceInfo, FeatureContext context) { 
     final Class<?> declaring = resourceInfo.getResourceClass(); 
     context.register(compressionFilter); 
    } 
} 

注:CompressionFeatureはorg.jboss.resteasy.plugins.interceptors.encoding.ServerContentEncodingAnnotationFeatureに基づいています。

+0

これも重く見える場合は、 'Logger'インスタンスと' declaring'ローカル変数を削除できます。これはほんの数行です。そしてそれは魅力のように機能します! –

1

インターフェイスの背後にAPIを実装している場合、すべてのインターフェイスが1つのインターフェイスから継承される可能性があるため、「BaseAPI」 とし、BaseAPIに@Gzipを設定すると論理的に継承されたインターフェースとメソッド。

@GZIP 
public interface BaseAPI 
{ 
} 


public interface APIX extends BaseAPI 
{ 
    @GET 
    Response getSomething() { 
} 
関連する問題