我有一個RestEasy的+ Java EE應用程序。當我添加@GZIP到組件級,服務器答案是gzip壓縮,如果客戶端發送「接受:gzip的」RestEasy的普遍啓用Gzip
有沒有一種方法一般啓用所有組件的gzip?我不喜歡爲每個班級添加註釋。
我使用RestEasy的JAX-RS 3.0.1
我有一個RestEasy的+ Java EE應用程序。當我添加@GZIP到組件級,服務器答案是gzip壓縮,如果客戶端發送「接受:gzip的」RestEasy的普遍啓用Gzip
有沒有一種方法一般啓用所有組件的gzip?我不喜歡爲每個班級添加註釋。
我使用RestEasy的JAX-RS 3.0.1
沒有,沒有辦法與註釋,使所有資源的gzip。如果您想放棄將註釋添加到每個類,您可以創建一個servlet過濾器來查看傳入的頭文件,並在出口時對gzip響應進行gzip。
您可以用自定義的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攔截器應該做了其餘的工作。
我已經使用類似的機制來創建自定義壓縮過濾器(雖然我結束了設置它由註釋被施加到限制範圍)。
我@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。
如果您正在實現您的API接口後,讓所有的接口可能會從一個接口繼承,讓我們的名字是「BaseAPI」 和邏輯,如果你在BaseAPI設置@Gzip所以它將適用內容編碼爲所有繼承的接口和方法。
@GZIP
public interface BaseAPI
{
}
public interface APIX extends BaseAPI
{
@GET
Response getSomething() {
}
如果這也看起來很重要 - 您可以刪除'Logger'實例和'declaring'局部變量。這實際上只是幾行。它就像一個魅力! –