Java CDI嵌套生产者问题
我是CDI的新手,我有一个有点难以解释的问题,但让我们试试看。我希望有一个cdi生产者,它生成一个名为RequestData的类的请求范围实例,例如(其伪代码): 我知道,只要请求上下文存在,这个cdi生产者就会生成一个“存在”于wildfly应用服务器中的实例(只要请求持续,我们就称它为请求单例实例thingy) 现在我想让RequestData类包含更多的cdi生产者。如本例所示(同样是java伪代码): 我的问题的最后一个问题是如何强制从MyBean中的请求单例实例生成param1和param2(我需要什么java代码/注释或其他什么) 总之,MyBean生成RequestData,RequestData在整个请求时间内都是活动的,并且它将生成param1,param2 下面是一个类注入param1的示例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
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();
}
}