Java CDI嵌套生产者问题

Java CDI嵌套生产者问题,java,jakarta-ee,dependency-injection,cdi,Java,Jakarta Ee,Dependency Injection,Cdi,我是CDI的新手,我有一个有点难以解释的问题,但让我们试试看。我希望有一个cdi生产者,它生成一个名为RequestData的类的请求范围实例,例如(其伪代码): 我知道,只要请求上下文存在,这个cdi生产者就会生成一个“存在”于wildfly应用服务器中的实例(只要请求持续,我们就称它为请求单例实例thingy) 现在我想让RequestData类包含更多的cdi生产者。如本例所示(同样是java伪代码): 我的问题的最后一个问题是如何强制从MyBean中的请求单例实例生成param1和par

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

我知道,只要请求上下文存在,这个cdi生产者就会生成一个“存在”于wildfly应用服务器中的实例(只要请求持续,我们就称它为请求单例实例thingy)

现在我想让RequestData类包含更多的cdi生产者。如本例所示(同样是java伪代码):

我的问题的最后一个问题是如何强制从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()?

这是错误的方法。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();
   }
}
@RequestScoped//或任何作用域
公共类填充服务{
@注入
私有实例somethingData;
公共空间{
//这里需要注意的是,somethingData.get()可能返回null
somethingData.get().soSomething();
}
}

嗨,这不是我想要的,但我喜欢。你能按我的要求解决我的问题吗?第一,我不会按你想的方式解决你的问题。要生成param1和param2,我需要依赖于
RequestData
如下:
@products@RequestScoped public Something1 product(RequestData rd)
@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();
   }
}