@Context对象来自哪里

2022-09-04 03:53:38

我一直在到处寻找,但似乎找不到明确的答案......

服务器(针对我的问题的玻璃鱼)注入带有@Context注释的实际objets的机制是什么?更具体地说,如果我想写一个类来做这样的事情:

@Path("/")
public class MyResource {
  @GET
  public String doSomething(@Context MyObject obj) {
    // ...
  }
}

那我该怎么做呢?MyObject在哪里被实例化,谁来做,以及如何做?

编辑:我见过这样的东西:

在 JAX-RS 中使用@Context、@Provider和上下文解析器

http://jersey.576304.n2.nabble.com/ContextResolver-confusion-td5654154.html

但是,这与我所看到的并不一致,例如在org.neo4j.server.rest.web.RestfulGraphDatabase的构造函数中,它具有以下签名:

public RestfulGraphDatabase(
  @Context UriInfo uriInfo,
  @Context Database database,
  @Context InputFormat input,
  @Context OutputFormat output,
  @Context LeaseManager leaseManager )

答案 1

您可以编写自己的注入提供程序并将其插入 Jersey - 查看 SingletonTypeInjectableProviderPerRequestTypeInjectableProvider - 扩展这些类之一(具体取决于您希望注入对象的生命周期),并将您的实现注册为 Web 应用程序中的提供程序。

例如,像这样:

@Provider
public class MyObjectProvider extends SingletonTypeInjectableProvider<Context, MyObject> {
    public MyObjectProvider() {
        // binds MyObject.class to a single MyObject instance
        // i.e. the instance of MyObject created bellow will be injected if you use
        // @Context MyObject myObject
        super(MyObject.class, new MyObject());
    }
}

若要在 Web 应用中包含提供程序,你有几个选项:

  1. 如果你的应用使用类路径扫描(或包扫描),只需确保提供程序位于正确的包中/在类路径上
  2. 或者你可以简单地使用META-INF/services条目注册它(添加META-INF/services/com.sun.jersey.spi.inject.InjectableProvider文件,在其内容中包含你的提供者类的名称)

答案 2

我想我可能会做点什么...如果这有效,马丁应该得到部分荣誉。:)

看起来@Provider类必须实现 com.sun.jersey.spi.inject.injectable<T> 接口。但是,我不确定这是否足以实际注入@Context。缺少的是,我们必须告诉Web应用程序的ResourceConfig对象有关@Provider。在我试图做的事情的上下文中,并从neo4j-server中获取提示,剩下的工作归结为:

  • extending com.sun.jersey.spi.container.servlet.ServletContainer,并覆盖配置方法:
@Override
protected void configure(WebConfig wc, ResourceConfig rc, WebApplication wa)
{
  super.configure( wc, rc, wa );
  Set<Object> singletons = rc.getSingletons();
  singletons.add(new MyObjectProvider());
}
  • 指定必须在 Web 中使用此容器.xml部署描述符:
<servlet>
  <servlet-name>JAX-RS Servlet Container</servlet-name>
  <servlet-class>com.blah.MyServletContainer</servlet-class>
</servlet>

推荐