2013-07-25 72 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() { 
}