Java @Context对象来自哪里
我到处找,但似乎找不到明确的答案 服务器(我的问题是glassfish)注入带有@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在哪里实例化,由谁实例化,以及如何实例化 编辑:我看到过如下内
@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类型可能:
您可以编写自己的注入提供程序并将其插入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应用程序中包含提供商,您有几个选项:
我想我可能知道了一些事情……如果这能奏效,马丁应该得到部分学分。:) @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>