【问题标题】:CDI Nested Producers IssueCDI 嵌套生产者问题
【发布时间】:2017-09-04 03:57:58
【问题描述】:

我是 CDI 的新手,我遇到了一个难以解释的问题,但让我们试一试。我想要一个 cdi 生产者,它产生一个名为 RequestData 的类的请求范围实例,例如这里(它的伪代码):

 public class MyBean {
  private RequestData dataHolder;

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

我知道这个 cdi 生产者会产生一个实例,只要请求上下文存在(只要请求持续存在,我们就称它为 request-singleton 实例)

现在我想让 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()?

【问题讨论】:

    标签: java jakarta-ee dependency-injection cdi


    【解决方案1】:

    这是错误的方法。 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();
       }
    }
    

    【讨论】:

    • 嗨,这不是我想要的,但我喜欢它。您能根据我的要求尝试解决我的问题吗?
    • 一,我不会以你想要的方式解决你的问题。要生成 param1 和 param2,我将依赖于 RequestData,如下所示:@Produces @RequestScoped public Something1 produce(RequestData rd)
    猜你喜欢
    • 2023-03-29
    • 2015-04-08
    • 1970-01-01
    • 2022-10-12
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多