我是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()?
答案 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();
}
}