2013-07-25 70 views
5

我有一個RestEasy的+ Java EE應用程序。當我添加@GZIP到組件級,服務器答案是gzip壓縮,如果客戶端發送「接受:gzip的」RestEasy的普遍啓用Gzip

有沒有一種方法一般啓用所有組件的gzip?我不喜歡爲每個班級添加註釋。

我使用RestEasy的JAX-RS 3.0.1

回答

0

沒有,沒有辦法與註釋,使所有資源的gzip。如果您想放棄將註釋添加到每個類,您可以創建一個servlet過濾器來查看傳入的頭文件,並在出口時對gzip響應進行gzip。

0

您可以用自定義的JAX-RS這樣做2.0的過濾器和攔截器,並它甚至不是特別難,一旦你知道怎麼辦。

你需要做的是添加一個過濾器,修改現有的GZIP所以它並沒有檢查的註釋是存在支持的編碼,它只會尋找Accept-Encoding頭。

看RestEasy的GZIP編碼是如何實現的: https://github.com/resteasy/Resteasy/tree/master/jaxrs/resteasy-jaxrs/src/main/java/org/jboss/resteasy/plugins/interceptors/encoding

你需要補充的是有方法configure(ResourceInfo resourceInfo, FeatureContext configurable)總是添加GZIP過濾器,無論本說明的特點。您需要一個註冊自定義Filter for Server的功能,另一個用於Client。

隨着那些到位,預先存在的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接口後,讓所有的接口可能會從一個接口繼承,讓我們的名字是「BaseAPI」 和邏輯,如果你在BaseAPI設置@Gzip所以它將適用內容編碼爲所有繼承的接口和方法。

@GZIP 
public interface BaseAPI 
{ 
} 


public interface APIX extends BaseAPI 
{ 
    @GET 
    Response getSomething() { 
}