【问题标题】:Subresouce and CDI Injection Issue子资源和 CDI 注入问题
【发布时间】:2017-02-28 08:51:54
【问题描述】:

我是 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 一起使用?

【问题讨论】:

    标签: java rest jakarta-ee jax-rs cdi


    【解决方案1】:

    这与子资源或 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 创建对象。明显的例外是制片人,但我们在这里不是在谈论这些。

    【讨论】:

    • 非常感谢。使用子资源和 cdi 注入时的最佳做法是什么?是资源上下文吗?
    • 这是一个非常模糊的问题。不管对你有用,真的。顺便说一句 - ResouceContext 不是 CDI 本身的一个类,它是与 CDI 集成的 javax.ws.rs.container 打包它。此外,查看ResourceContext javadoc,它显示为:The resource context provides access to instances of resource classes.(以及更多......)所以是的,这完全是一种有效且完全预期的方式!
    【解决方案2】:

    每当您创建这样的对象时:

    return new SubResource();
    

    那么它的生命周期就属于你,不会对其执行任何注入。

    在第二种情况下,您允许 JAX-RS 容器创建 SubResource

    return context.getResource(SubResource.class);
    

    这使它可以控制对象生命周期,使其有机会执行注入和其他生命周期操作,例如执行@PostConstruct 注释方法。

    【讨论】:

    • 非常感谢。使用子资源和 cdi 注入时的最佳做法是什么?是资源上下文吗?
    • 最佳实践是使用最简单的可行解决方案。
    猜你喜欢
    • 1970-01-01
    • 2014-04-23
    • 2015-05-05
    • 2015-12-16
    • 1970-01-01
    • 2010-10-27
    • 2014-12-27
    • 1970-01-01
    • 2015-07-15
    相关资源
    最近更新 更多