@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应用程序中包含提供程序,您有以下几种选择:
- 如果您的应用程序使用类路径扫描(或包扫描),请确保提供程序位于类路径中的正确包中
- 或者您只需使用META-INF / services条目注册它(在其内容中添加META-INF / services / com.sun.jersey.spi.inject.InjectableProvider文件,其中包含您的提供者类的名称)
我想我可能会做些什么……如果这样可行,马丁应该获得部分功劳。 🙂
似乎@Provider类必须实现com.sun.jersey.spi.inject.Injectable
- 扩展com.sun.jersey.spi.container.servlet.ServletContainer,并覆盖configure方法:
@Override protected void configure(WebConfig wc, ResourceConfig rc, WebApplication wa) { super.configure( wc, rc, wa ); Set
- 指定必须在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类型可以是:
- 是一种原始的类型;
- 有一个接受单个String参数的构造函数;
- 有一个名为valueOf或fromString的静态方法接受单个String参数(例如,参见Integer.valueOf(String)和java.util.UUID.fromString(String)); 要么
- Be List,Set或SortedSet,其中T满足上面的2或3。 生成的集合是只读的。
请参阅JAX-RS规范的第5-6章 。 这应该告诉你需要知道的一切。