2014-01-29 39 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