1

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

  1. 使用自定义注释:对 writeTo(...) 的每次调用都包括被调用方法的注释列表,因此我可以检查是否存在一些注释。然而,JAX-RS 方法已经充满了元编程。
  2. 使用 ThreadLocal 属性映射:假设每个线程一个请求,但这种方法有点破坏封装。资源方法需要知道那里有一些其他的类,正在寻找这个地图。

有没有办法改变提供者本身的生命周期?我正在使用泽西岛。

4

2 回答 2

2

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

虽然@Provider是单例。您仍然可以在其中使用 per-request 对象,如下所示。

@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. 这是一个关于它的链接。

于 2013-05-02T07:38:41.660 回答
1

JAX-RS 1.1 规范要求实现支持单例提供程序并允许支持其他生命周期,但不建议任何其他内容。据我所知,纯泽西不支持单例以外的任何东西。使用jersey-spring contrib 模块,您可以支持将 Spring 用作 Jersey 的 IoC 容器(它从中获取资源和提供者实例)。我知道 Spring 支持多个生命周期,包括请求,但我不确定 jersey-spring 是否内置了对它的支持。

于 2013-05-02T00:30:37.983 回答