JAX-RS过滤调用序列

时间:2015-03-20 06:25:48

标签: jaxb jax-rs marshalling unmarshalling

我的JAX-RS过滤器的实现如下,

请求过滤器是:

   public class AuthorizationRequestFilter implements ContainerRequestFilter {
        public static long entryTime;
         @Override
            public void filter(ContainerRequestContext requestContext)
                            throws IOException {

             /*some preprocessing before unmarshalling*/
            }
    }

响应过滤器是: -

public class ResponseFilter实现ContainerResponseFilter {

 @Override
        public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
            throws IOException {

        if (!requestContext.getMethod().equalsIgnoreCase("Head")) {
             /*Some processing after Marshalling*/

        }

}

我的经纪人是: -

@POST
@Path("abc")
@Produces(MediaType.APPLICATION_XML)
public  Response createABC(App app){
/*lines of code*/
return Response.status(Status.CRETED).entity(abc).build();
}

我的问题是在Marshallling和Unmarshalling之后调用的过滤器,即在调用响应过滤器之前在方法AuthorizationRequestFilter和abc被编组之后创建的app对象

1 个答案:

答案 0 :(得分:0)

在解组之前调用请求过滤器。这应该是显而易见的,因为您仍然可以访问实体输入流(意味着它还没有被读取)。您可以通过编写一个简单的MessageBodyReader来轻松地对此进行测试。在请求过滤器中设置任意标头,然后您就可以从reader readFrom方法中提取相同的标头。

在编组之前将调用响应过滤器。再一次,这可以通过编写一个简单的MessageBodyWriter来轻松测试。在过滤器中设置任意标头,您应该能够在编写器的writeTo方法中访问它。

如果你想在编组后执行某些操作,你可以使用WriterInterceptor,它将调用包裹在编写器的编组方法中。例如

@Provider
public class SimpleIntercetor implements WriterInterceptor{

    @Override
    public void aroundWriteTo(WriterInterceptorContext context) 
            throws IOException, WebApplicationException {

        // Processing before marshalling

        context.proceed();  // marshal

        // Processing after marshalling
    }
}

部分资源:

这些链接指向Jersey文档,但拦截器,读取器,编写器是JAX-RS 2.0的标准,因此文档应适用于您正在使用的任何实现(大部分: - )