@Context对象来自哪里

时间:2012-06-05 13:10:08

标签: java glassfish jersey jax-rs

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

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

的类
@Path("/")
public class MyResource {
  @GET
  public String doSomething(@Context MyObject obj) {
    // ...
  }
}
那我该怎么办呢? MyObject在哪里实现,谁在做,以及如何实现?

编辑:我见过以下内容:

Using @Context, @Provider and ContextResolver in JAX-RS

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 )

4 个答案:

答案 0 :(得分:8)

您可以编写自己的注射提取器并将其插入Jersey - 查看SingletonTypeInjectableProviderPerRequestTypeInjectableProvider - 扩展其中一个类(取决于您对可注射对象的生命周期)并注册您的在您的网络应用中作为提供商实施。

例如,像这样:

@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());
    }
}

要在您的网络应用中添加提供商,您有以下几种选择:

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

答案 1 :(得分:3)

我想我可能会做些什么......如果这样做,马丁应该获得部分功劳。 :)

似乎@Provider类必须实现 com.sun.jersey.spi.inject.Injectable&lt; T&gt; 界面。但是,我不确定这是否足以实际注入@Context。缺少的是,我们必须告诉Web应用程序的ResourceConfig对象有关@Provider的信息。在我正在尝试做的事情中,并从neo4j-server获取提示,剩下的工作归结为:

  • 扩展com.sun.jersey.spi.container.servlet.ServletContainer,并覆盖configure方法:
@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>

答案 2 :(得分:0)

我认为您不能将@ContextMyObject这样的用户定义类型一起使用。这是为了注入jax-ws已经理解的类型。提到here

  JAX-RS规范的

Chapter 5提供了可与@Context一起使用的所有标准JAX-RS Java类型。

您可能希望使用@FormParam@PathParam之类的内容。有关说明,请参阅规范的section 2.3。这是你的答案,从规范的那一部分复制而来:

  

通常,方法参数的Java类型可以是:

     
      
  1. 是原始类型;
  2.   
  3. 拥有一个接受单个String参数的构造函数;
  4.   
  5. 有一个名为valueOf或fromString的静态方法,它接受一个String参数(例如,参见Integer.valueOf(String)和java.util.UUID.fromString(String));或
  6.   
  7. Be List,Set或SortedSet,其中T满足上面的2或3。生成的集合是只读的。
  8.   

答案 3 :(得分:-1)

chapters 5-6 of the JAX-RS spec。这应该告诉你需要知道的一切。