[英]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 Injection可以与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托管的“对象”)并告诉它为您检索资源。 因此,您让CDI容器处理对象创建及其生命周期。 由于它管理创建,它还可以解析注入点并注入MyBean
。
通常,当您想要使用CDI时,您几乎不会通过new
创建对象。 明显的例外是生产者,但我们不是在这里谈论它们。
每当你创建这样的对象时:
return new SubResource();
然后它的生命周期属于你,并且没有对它进行注射。
在第二种情况下,您已允许JAX-RS容器创建SubResource
:
return context.getResource(SubResource.class);
这使它能够控制对象生命周期,使其有机会执行注入和其他生命周期操作,例如执行@PostConstruct
注释方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.