@Context对象来自哪里

Kri*_*ket 13 java glassfish jax-rs jersey

我一直在寻找,但似乎无法找到一个明确的答案......

服务器(我的问题的玻璃鱼)注入用@Context注释的实际objets的机制是什么?更具体地说,如果我想编写一个类似于以下内容的类:

@Path("/")
public class MyResource {
  @GET
  public String doSomething(@Context MyObject obj) {
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

那我该怎么办?MyObject在哪里实现,谁在实现它,以及如何实现?

编辑:我见过以下内容:

在JAX-RS中使用@ Context,@ Extider和ContextResolver

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 )
Run Code Online (Sandbox Code Playgroud)

Mar*_*ula 8

您可以编写自己的注入提供程序并将其插入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());
    }
}
Run Code Online (Sandbox Code Playgroud)

要在Web应用程序中包含提供程序,您有以下几种选择:

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