@Context对象来自哪里

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

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

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

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

编辑:我见过以下内容:

在JAX-RS中使用@ Context,@ Provider和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 ) 

您可以编写自己的注入提供程序并将其插入Jersey – 查看SingletonTypeInjectableProvider和PerRequestTypeInjectableProvider – 扩展其中一个类(取决于您对可注入对象的生命周期),并在Web应用程序中将您的实现注册为提供程序。

例如,像这样:

 @Provider public class MyObjectProvider extends SingletonTypeInjectableProvider { public MyObjectProvider() { // binds MyObject.class to a single MyObject instance // ie 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文件,其中包含您的提供者类的名称)

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

似乎@Provider类必须实现com.sun.jersey.spi.inject.Injectable 接口。 但是,我不确定这是否足以实际注入@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 singletons = rc.getSingletons(); singletons.add(new MyObjectProvider()); } 
  • 指定必须在web.xml部署描述符中使用此容器:
  JAX-RS Servlet Container com.blah.MyServletContainer  

我不认为你可以使用像MyObject这样的用户定义类型的@Context 。 这是为了注入jax-ws已经理解的类型。 这里提到了 。

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

您可能希望使用@FormParam@PathParam类的东西。 有关说明,请参阅规范的第2.3节 。 这是你的答案,从规范的那一部分复制:

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

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

请参阅JAX-RS规范的第5-6章 。 这应该告诉你需要知道的一切。