我的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对象
答案 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的标准,因此文档应适用于您正在使用的任何实现(大部分: - )