2014-01-29 41 views
2

我測試澤西攔截器和過濾器。我有這個州2.4攔截代碼:澤西島2.4 ResponseInterceptor不工作

@Provider 
@Test 
public class TestInterceptor implements WriterInterceptor, ReaderInterceptor { 
    private final static Logger log = .... 

    @Override 
    public void aroundWriteTo (WriterInterceptorContext context) 
     throws IOException, WebApplicationException { 
     log.debug("WriterInterceptor"); 
     context.proceed(); 
    } 

    @Override 
    public Object aroundReadFrom(ReaderInterceptorContext ric) 
     throws IOException, WebApplicationException { 
     log.debug("ReaderInterceptor"); 
     return ric.proceed(); 
    }  
} 

我的資源方法:

@Path("{test}") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
@Test 
public FooObj test() { 
    log.debug("test method"); 
    return new FooObj(); 
} 

兩個過濾器:

@Provider 
public class ResponseFil implements ContainerResponseFilter { 
    private final static Logger log = .... 

    @Override 
    public void filter(ContainerRequestContext crc, ContainerResponseContext crc1) 
     throws IOException { 
     log.debug("ResponseFil"); 
    } 
} 

@Provider 
public class RequestFil implements ContainerRequestFilter { 
    private final static Logger log = .... 
    @Override 
    public void filter(ContainerRequestContext crc) throws IOException { 
     log.debug("RequestFil"); 
    } 
} 

和我的web.xml servlet配置:

<servlet> 
    <description>Servlet test</description> 
    <servlet-name>REST_servlet</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.test.rest</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

當我從firefox輸入u rl地址資源並得到結果,日誌控制檯顯示:

RequestFil 
test method 
ResponseFil 
WriterInterceptor 

爲什麼ReaderInterceptor沒有執行?我試圖用兩個具有相同結果的自定義綁定名稱(@Test和@ Test2)來分隔兩個類中的寫入和讀取器攔截器。

由於

回答

6

攔截器僅當請求/響應實體可被執行(ReaderInterceptor/WriterInterceptor的實現)。在你的情況下,這意味着只有WriterInterceptor正在執行,因爲你正在從你的資源方法向客戶發送實體(FooObj的一個實例)。如果你有一個POST方法接收來自用戶的輸入,你的ReaderInterceptor也會被調用。

如果您需要修改請求(即使沒有實體存在),請使用ContainerRequestFilter/ContainerResponseFilter

請參閱JAX-RS 2.0 spec for more info。

+0

好的,理解。謝謝。 – user1151816