2013-07-25 3 views
5

RestEasy + Java EE 애플리케이션이 있습니다. 구성 요소 클래스에 @GZIP을 추가하면 클라이언트가 "accepts : gzip"을 보내면 server-answer가 gzip으로됩니다.일반적으로 GZIP 사용 가능

일반적으로 모든 구성 요소에 gzip을 사용할 수 있습니까? 모든 클래스에 주석을 추가하고 싶지 않습니다.

내가 RESTEasy가 JAX-RS

답변

0

없음 3.0.1를 사용하고, 모든 자원에 대한 GZIP을 가능하게 주석 방법이 없습니다. 어노테이션을 모든 클래스에 추가하지 않으려면 수신 헤더를보고 서둘러 응답을 gzips하는 서블릿 필터를 만들 수 있습니다.

0

사용자 정의 JAX-RS 2.0 필터와 인터셉터를 사용하여 이것을 수행 할 수 있으며 방법을 알면 특별히 어렵지 않습니다. 당신이해야 할 것들

주석에 대한 하지 검사가 인코딩을 지원하기 위해 존재하는 것으로 않도록 GZIP의 기존 수정하는 필터를 추가, 그것은 단지 수락-Encoding 헤더를 찾습니다 . 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를 구현하면 모든 인터페이스가 하나의 인터페이스에서 상속 될 수 있으므로 "BaseAPI"는 이고 BaseAPI에 @Gzip을 설정하면 논리적으로 모든 사람에게 Content-Encoding이 적용됩니다. 상속 된 인터페이스 및 메서드.

@GZIP 
public interface BaseAPI 
{ 
} 


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