子资源和 CDI 注入问题
Subresouce and CDI Injection Issue
我是 jax-rs 的新手,我被子资源困住了。看一看。
这不起作用
@Path(..)
public class Test
{
@Path(...)
public SubResource getSub(){
return new SubResource();
}
}
public class SubResource {
@Inject
private MyBean myBean;
@GET
public String getStr(){
return myBean.getStr(); // myBean is null, injection didnt work properly
}
这是可行的,但为什么呢????
@Path(..)
public class Test
{
@Context
private ResourceContext context;
@Path(...)
public SubResource getSub(){
return context.getResource(SubResource.class);
}
}
public class SubResource{
@Inject
private MyBean myBean;
@GET
public String getStr(){
return myBean.getStr(); // myBean is not null anymore, why?
}
为什么 CDI 注入与 ResoureContext 一起使用?
这与子资源或 JAX-RS 无关。原则上,这是关于 CDI 注入的工作原理。
首先,您的样本无效。或者准确地说,这个位:
@Path(...)
public SubResource getSub(){
return new SubResource();
}
您正在通过 new
关键字创建 SubResource
实例 您自己。因此 CDI 对其存在一无所知,对此类对象的控制绝对为零。因此,CDI 无法向该对象注入任何内容。
现在开始工作示例:
@Context
private ResourceContext context;
@Path(...)
public SubResource getSub(){
return context.getResource(SubResource.class);
}
在这种情况下,您注入了一个上下文(CDI 已经管理 "object")并告诉它为您检索资源。因此,您让 CDI 容器处理对象创建及其生命周期。而且由于它管理创建,它还可以解析注入点并注入 MyBean
.
通常,当您想使用 CDI 时,您几乎不会通过 new
创建对象。明显的例外是生产者,但我们在这里不讨论这些。
每当您创建这样的对象时:
return new SubResource();
那么它的生命周期就属于你了,不会对其进行注入。
在第二种情况下,您允许 JAX-RS 容器创建 SubResource
:
return context.getResource(SubResource.class);
这使它能够控制对象生命周期,使其有机会执行注入和其他生命周期操作,例如执行 @PostConstruct
注释方法。
我是 jax-rs 的新手,我被子资源困住了。看一看。
这不起作用
@Path(..)
public class Test
{
@Path(...)
public SubResource getSub(){
return new SubResource();
}
}
public class SubResource {
@Inject
private MyBean myBean;
@GET
public String getStr(){
return myBean.getStr(); // myBean is null, injection didnt work properly
}
这是可行的,但为什么呢????
@Path(..)
public class Test
{
@Context
private ResourceContext context;
@Path(...)
public SubResource getSub(){
return context.getResource(SubResource.class);
}
}
public class SubResource{
@Inject
private MyBean myBean;
@GET
public String getStr(){
return myBean.getStr(); // myBean is not null anymore, why?
}
为什么 CDI 注入与 ResoureContext 一起使用?
这与子资源或 JAX-RS 无关。原则上,这是关于 CDI 注入的工作原理。
首先,您的样本无效。或者准确地说,这个位:
@Path(...)
public SubResource getSub(){
return new SubResource();
}
您正在通过 new
关键字创建 SubResource
实例 您自己。因此 CDI 对其存在一无所知,对此类对象的控制绝对为零。因此,CDI 无法向该对象注入任何内容。
现在开始工作示例:
@Context
private ResourceContext context;
@Path(...)
public SubResource getSub(){
return context.getResource(SubResource.class);
}
在这种情况下,您注入了一个上下文(CDI 已经管理 "object")并告诉它为您检索资源。因此,您让 CDI 容器处理对象创建及其生命周期。而且由于它管理创建,它还可以解析注入点并注入 MyBean
.
通常,当您想使用 CDI 时,您几乎不会通过 new
创建对象。明显的例外是生产者,但我们在这里不讨论这些。
每当您创建这样的对象时:
return new SubResource();
那么它的生命周期就属于你了,不会对其进行注入。
在第二种情况下,您允许 JAX-RS 容器创建 SubResource
:
return context.getResource(SubResource.class);
这使它能够控制对象生命周期,使其有机会执行注入和其他生命周期操作,例如执行 @PostConstruct
注释方法。