有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java@Context对象来自哪里

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

服务器(我的问题是glassfish)注入带有@Context注释的实际对象的机制是什么?更具体地说,如果我想写一个类,做如下事情:

@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。服务器休息网状物RestfulGraphDatabase,具有以下签名:

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

共 (4) 个答案

  1. # 1 楼答案

    我认为@Context不能与MyObject这样的用户定义类型一起使用。它是为了注入jax-ws已经理解的类型。有人提到here

    Chapter 5 of the JAX-RS specification presents all the standard JAX-RS Java types that may be used with @Context.

    你可能想用@FormParam@PathParam之类的东西来代替。有关说明,请参见规范的section 2.3。以下是您的答案,摘自规范的该部分:

    In general the Java type of the method parameter may:

    1. Be a primitive type;
    2. Have a constructor that accepts a single String argument;
    3. Have a static method named valueOf or fromString that accepts a single String argument (see, for example, Integer.valueOf(String) and java.util.UUID.fromString(String)); or
    4. Be List, Set or SortedSet, where T satisfies 2 or 3 above. The resulting collection is read-only.
  2. # 2 楼答案

    我想我可能知道些什么。。。如果这能奏效,马丁应该得到部分学分。:)

    @Provider类似乎必须实现com。太阳运动衫spi。注射可注射<;T>界面。然而,我不确定这是否足以注入@Context。缺少的是,我们必须告诉web应用程序的ResourceConfig对象@Provider。在我试图做的事情的背景下,并从neo4j服务器得到提示,剩下的工作可以归结为:

    • 扩展com。太阳运动衫spi。容器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>
    
  3. # 4 楼答案

    您可以编写自己的注入提供程序,并将其插入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文件,其内容中包含您的提供者类的名称)