我想在我们的项目中引入 CDI(焊接),但现在手动构建的对象遇到了一些问题。
所以我们有一些实现IReport
接口的类,它们有一个应该注入的字段。这在运行时为 null,因为所有这些类都是由ReportFactory
in a class生成的ReportController
。
private Map<String,Object> generateReport(ReportInfo ri, ...) {
// some input validation
IReport report = ReportControllerFactory.getReportInstance( ri.getClassName() );
// ...
}
我知道我可以将@Produces
注释与 中的另一个自定义注释一起使用ReportControllerFactory
,但是如何将@Inject
用于只能在完成一些验证后在方法内创建的变量?我将如何提交参数ri.getClassName()
?对象在构造ri
时是未知的ReportController
。
非常感谢!
亲切的问候,塞巴斯蒂安
2011 年 7 月 8 日 (10:00) 编辑:
报告工厂类:
public static IReport getReportInstance( String className ) throws ReportException {
IReport report = null;
try {
Class<?> clazz = Class.forName( className );
report = (IReport) clazz.newInstance();
}
catch ( Exception e ) { … }
return report;
}
编辑 2(选择正确的报告实施)
报表实例由一些从 JSF 前端到 ReportController 的路径选择。ManagedBean 调用一个会话 bean,该会话 bean 有多种方法,具体取决于在何处按下了哪个按钮。所有这些方法都设置报告名称并调用更通用的方法sendOrGetReport
。此方法从数据库中选择指定报表的唯一键,并决定是发送电子邮件还是立即发送报表。让我们假设它应该交付。
然后ReportController
开始发挥作用。他ReportInfo
根据上述方法提供的唯一键和其他信息获取对象,并调用ReportFactory
来创建类型的报告ri.getClassName()
。
花哨的,是吗?我认为整个部分可能需要一些重构。如果您没有看到任何容易的地方,我会跳过@Inject
报告实现中的 并为该资源进行 JDNI 查找。