Jersey 2.4 ReaderInterceptor无法正常工作

use*_*816 2 java httprequest jersey-2.0

我正在测试泽西拦截器和过滤器.我有这个Jersey 2.4拦截器代码:

@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();
    }    
}
Run Code Online (Sandbox Code Playgroud)

我的资源方法:

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

两个过滤器:

@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");
    }
}
Run Code Online (Sandbox Code Playgroud)

和我的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>
Run Code Online (Sandbox Code Playgroud)

从firefox我输入url地址资源并获得结果时,日志控制台显示:

RequestFil
test method
ResponseFil
WriterInterceptor
Run Code Online (Sandbox Code Playgroud)

为什么不执行ReaderInterceptor?我试图用两个自定义绑定名称(@Test和@ Test2)将写入和读取器拦截器分成两个类,结果相同.

谢谢

Mic*_*dos 7

仅当请求/响应实体可用时才执行拦截器(ReaderInterceptor/WriterInterceptor的实现).在您的情况下,这意味着只有在您从资源方法向客户端WriterInterceptor发送实体(实例FooObj)时才执行.如果你有一个POST接收用户输入的方法,你ReaderInterceptor也会被调用.

如果您需要修改请求,即使没有实体存在,请使用ContainerRequestFilter/ContainerResponseFilter.

有关详细信息,请参阅JAX-RS 2.0规范.