CDI嵌套生产者问题

时间:2017-04-08 21:35:40

标签: java java-ee dependency-injection cdi

我是CDI的新手,我有一个问题有点难以解释,但我们试一试。我想有一个cdi生成器,它生成一个名为RequestData的类的请求范围实例,例如这里(其伪代码):

 public class MyBean {
  private RequestData dataHolder;

  @Produces
  @RequestScoped
  public RequestData getData() {
   return dataHolder;
  }
}

我知道这个cdi制作人会产生一个"生活"在wildfly应用服务器中,只要请求上下文存在(只要请求持续,就调用它请求 - 单例实例)

现在我希望RequestData类包含更多的cdi生成器。就像在这个例子中一样(再次是java伪代码):

public class RequestData {
 private Something1 param1;
 private Something2 param2;
 ...

 @Produces
 public Something1 getParam1(){
  return param1;
 }

 @Produces
 public Something2 getParam2(){
  ...
 }
}

我的问题的最后一个问题是我如何强制从MyBean中的请求单例实例生成param1和param2(我需要什么java代码/注释)?

总结一下MyBean产生的RequestData和RequestData在整个请求时间内都是活着的,而且它还会生成param1,param2。

这里有一个注入param1的类的例子

public class Stuff{

 @Inject
 public void startup(Something1 param1){
 // param1 shall come from MyBean.getData().getParam1()
 }
}

任何想法如何实现这一点?如何让cdi引擎为param1做MyBean.getData()。getParam1()?

1 个答案:

答案 0 :(得分:0)

这是错误的做法。 CDI是一个非常强大的注入框架。如何使用它进行注射取决于你对它的理解程度。

对于这种情况,使用Instance延迟注射要容易得多:

@ApplicationScoped //No need to be request scope, CDI is quite smart
public class RequestContextProvider {

   @Inject
   private HttpServletRequest servletRequest;

   @Produces
   @Dependent //Make dependent if it can be null, if you are sure it cannot be, just declare it as RequestScoped
   public SomethingData createSomethingData(InjectionPoint ip) {
       String requestParam = servletRequest.getParameter("something-data");
       if(requestParam == null) {
           return null;
       }

       return initSomethingData(requestParam);
   }

}

用法看起来像这样:

@RequestScoped //Or whichever scope
public class StuffService {

   @Inject
   private Instance<SomethingData> somethingData;

   public void doStuff() {
       //You need to take care here, that the somethingData.get() may return null
       somethingData.get().soSomething();
   }
}