Java 子资源和CDI注入问题
我对jax-rs还不熟悉,而且我一直在使用子资源。看一看 这不起作用Java 子资源和CDI注入问题,java,rest,jakarta-ee,jax-rs,cdi,Java,Rest,Jakarta Ee,Jax Rs,Cdi,我对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.g
@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注入与文本一起工作 这与子资源或JAX-RS无关。原则上,这是关于CDI注入如何工作的 首先,你的样品不起作用。或者准确地说,这一点:
@Path(...)
public SubResource getSub(){
return new SubResource();
}
您正在通过new
关键字创建SubResource
实例yourself。因此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容器创建子资源
:
return context.getResource(SubResource.class);
这使它能够控制对象生命周期,使它有机会执行注入和其他生命周期操作,例如执行
@PostConstruct
带注释的方法。非常感谢。使用子资源和cdi注入时的最佳实践是什么?是资源背景吗?这是一个非常模糊的问题。不管什么对你有用,真的。正如旁注-resourcecontext
不是CDI本身的一个类,它是与CDI集成的包itjavax.ws.rs.container
。另外,请看,它是这样写的:资源上下文提供对资源类实例的访问。
(以及更多…)因此,是的,这完全是一种有效且完全有意的方式!非常感谢。使用子资源和cdi注入时的最佳实践是什么?是resourceContext吗?最佳实践是使用最简单的有效解决方案。