Java @Context对象来自哪里

Java @Context对象来自哪里,java,glassfish,jersey,jax-rs,Java,Glassfish,Jersey,Jax Rs,我到处找,但似乎找不到明确的答案 服务器(我的问题是glassfish)注入带有@Context注释的实际对象的机制是什么?更具体地说,如果我想编写一个类,它可以执行以下操作: @Path("/") public class MyResource { @GET public String doSomething(@Context MyObject obj) { // ... } } 那我怎么做呢?MyObject在哪里实例化,由谁实例化,以及如何实例化 编辑:我看到过如下内

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

服务器(我的问题是glassfish)注入带有@Context注释的实际对象的机制是什么?更具体地说,如果我想编写一个类,它可以执行以下操作:

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

编辑:我看到过如下内容:

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

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

看。这应该告诉您需要了解的所有信息。

我认为您不能将
@Context
与用户定义的类型(如
MyObject
)一起使用。它是用于jax-ws已经理解的注入类型的。有人提到过

JAX-RS规范的第三部分介绍了可与@Context一起使用的所有标准JAX-RS Java类型

您可能希望使用类似于
@FormParam
@PathParam
的内容。有关说明,请参见规范的第1部分。以下是您的答案,摘自规范的该部分:

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

  • 是原始类型
  • 具有接受单个字符串参数的构造函数
  • 有一个名为valueOf或fromString的静态方法,该方法接受单个字符串参数(例如,请参见Integer.valueOf(String)和java.util.UUID.fromString(String));或
  • 是列表、集合或分类集合,其中T满足上述2或3。生成的集合是只读的

  • 您可以编写自己的注入提供程序并将其插入Jersey—查看并扩展其中一个类(取决于您希望注入对象的生命周期),并将您的实现注册为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());
        }
    }
    
    @Provider
    公共类MyObjectProvider扩展了SingletonTypeInjectableProvider{
    公共MyObjectProvider(){
    //将MyObject.class绑定到单个MyObject实例
    //也就是说,如果您使用
    //@Context MyObject MyObject
    super(MyObject.class,newmyobject());
    }
    }
    
    要在web应用程序中包含提供商,您有几个选项:

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

  • 我想我可能知道了一些事情……如果这能奏效,马丁应该得到部分学分。:)

    @Provider类似乎必须实现com.sun.jersey.spi.inject.Injectable接口。然而,我不确定这是否足以实际注入@Context。缺少的是,我们必须告诉web应用程序的ResourceConfig对象关于@Provider的信息。在我尝试做的内容中,并从neo4j服务器得到提示,剩下的工作归结为:

    • 扩展com.sun.jersey.spi.container.servlet.ServletContainer并重写configure方法:
    @覆盖
    受保护的无效配置(WebConfig wc、ResourceConfig rc、WebApplication wa)
    {
    超级配置(wc、rc、wa);
    Set singleton=rc.getsingleton();
    添加(新的MyObjectProvider());
    }
    
    • 指定此容器必须在web.xml部署描述符中使用:
    
    JAX-RSservlet容器
    com.blah.MyServletContainer
    

    这些文件是否说明了如何自己编写这样的功能?我明白这是个问题,你不知道。它是用于框架组件的。如果你想要依赖注入,就找一个DI容器,比如Spring。既然链接站点的内容可能会改变,那么只链接的答案不受欢迎吗?哦,不,你不需要这样做。我编辑了我的答案,以说明如何注册提供程序。如果您正在对javax.ws.rs.core.Application进行子类化,则可以使用
    this.getSingleton().add(new MyObjectProvider())注册提供程序在应用程序的构造函数中。链接已断开。请尝试以下操作:已从版本2.0+中删除这些类。您只能注入此处列出的12个允许的对象实例:
    
    @Override
    protected void configure(WebConfig wc, ResourceConfig rc, WebApplication wa)
    {
      super.configure( wc, rc, wa );
      Set<Object> singletons = rc.getSingletons();
      singletons.add(new MyObjectProvider());
    }
    
    <servlet>
      <servlet-name>JAX-RS Servlet Container</servlet-name>
      <servlet-class>com.blah.MyServletContainer</servlet-class>
    </servlet>