如何基于每个请求配置JAX-RS MessageBodyWriter?

时间:2013-05-01 22:39:52

标签: java jersey jax-rs

本质上,我有一个将对象写为JSON的MessageBodyWriter,我希望能够根据处理请求的资源方法控制输出的某些方面。但是,@Provider类的默认生命周期是singleton(每个JVM一个),因此我无法注入某个配置对象的实例。这给我留下了两个明显的解决方法:

  1. 使用自定义注释:每次调用writeTo(...)都包含已调用方法的注释列表,因此我可以检查是否存在某些注释。但是,JAX-RS方法已经充满了元编程。
  2. 使用ThreadLocal属性映射:假设每个线程有一个请求,但这种方法会破坏封装。资源方法需要知道还有其他类,寻找这个地图。
  3. 有没有办法改变提供商本身的生命周期?我正在使用泽西岛。

2 个答案:

答案 0 :(得分:2)

不确定为什么需要基于每个请求的MessageBodyWriter提供程序。如果您只是想区分哪些方法与JSON输出和哪些不是,那么jersey-json已经支持。

虽然@Provider是单身人士。您仍然可以在其中使用每个请求对象,如下所示。

@Provider
public class StViewProcessor implements ViewProcessor<ST> {     

    ......

    @Context
    HttpServletRequest request;


    public void writeTo(ST st, Viewable viewable, OutputStream out)
            throws IOException {
        System.out.println(request.getRequestURI());
        ...
    }


}

如果您想为每个请求注入实例,可以查看PerRequestTypeInjectableProvider。这是关于它的link

答案 1 :(得分:1)

JAX-RS 1.1规范requires that implementations support singleton providers and allows support for other lifecycles但并未提出其他任何建议。据我所知,纯粹的泽西岛并不支持单身人士之外的任何事情。使用the jersey-spring contrib module,您可以获得使用Spring作为Jersey的IoC容器(从中获取其资源和提供程序实例)的支持。我知道Spring支持多个生命周期,包括请求,但我不确定是否支持这种生命周期。{/ p>