子资源和 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 注释方法。