2017-10-11 14 views
0

자바 서블릿 API는 버전 3.0까지 HttpServletResponse에 대한 getStatus 메소드를 제공하지 않습니다. 나는 HttpServletResponse를 감싸기 위해 getStatus를 가진 HttpServletResponseWrapper를 생성하고 그것이 설정 될 때 상태를 잡는다.저지 2 상태 코드가 HttpServletResponseWrapper에 표시되지 않습니다.

내 Jersey 2 서블릿에서는 작동하지 않습니다.

내 HttpServletResponseWrapper는 내 필터의 doFilter (request, wrapperResponse)를 통해 전달됩니다. Jersey RESTful Servlet이 엔드 포인트 일 때 필터가 호출되지만 getStatus 메소드는 호출되지 않습니다.

내가 놓친 구성이 있습니까?

응답 작성자를 사용하여 결과를 반환하고 상태를 설정합니다.

Response.status (404) .build(); Response.status (200) .type (mediaType) .entity (theEntity) .build();

안부 요헨은

+0

'HttpServletResponseWrapper '가 필요한 이유는 무엇입니까? –

+0

gzip 필터의 상태 코드를 얻으려면 404 또는 204 응답에 gzip 헤더가 없습니다. – ScubaInstructor

답변

0

당신은 GZIP 압축을위한 HttpServletResponseWrapper 필요가 없습니다. JAX-RS에서 WriterInterceptor을 달성 할 수있다 :

@ApplicationPath("/api") 
public class MyApplication extends ResourceConfig { 

    public MyApplication() { 
     register(GZIPWriterInterceptor.class); 
    } 
} 

특정 자원 메소드 나 클래스, 당신은 할 수 인터셉터 바인딩 :

public class GZIPWriterInterceptor implements WriterInterceptor { 

    @Override 
    public void aroundWriteTo(WriterInterceptorContext context) 
       throws IOException, WebApplicationException { 
     final OutputStream outputStream = context.getOutputStream(); 
     context.setOutputStream(new GZIPOutputStream(outputStream)); 
     context.proceed(); 
    } 
} 

이 그런 다음 ResourceConfig/Application 서브 클래스에서 WriterInterceptor 등록 name binding annotations을 사용하십시오.

+0

제대로 작동합니다. 그 WriterInterceptor는 엔티티를 보낼 때만 트리거되므로 404와 204의 경우를 다룹니다. 그러나 요청에 Accept-Encoding : gzip, deflate, br 헤더가 없으면 어떻게이 gzip을 건너 뛸 수 있습니까? – ScubaInstructor

+0

@ScubaInstructor 당신은'@Context HttpHeaders httpHeaders'를 사용하여 인터셉터에 요청 헤더를 삽입 할 수 있어야합니다. –

+0

이 솔루션을 사용하여 EncodingFilter.enableFor (this, GZipEncoder.class, DeflateEncoder.class); WriterInterceptor를 스킵합니다. – ScubaInstructor