繁体   English   中英

Subresouce和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 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM