Я хотел ввести CDI (Weld) в наш проект, и теперь у меня возникли некоторые проблемы с объектами, которые создаются вручную.
Итак, у нас есть несколько классов, реализующих интерфейс IReport
, которые имеют поле, которое должнобыть введеннымЭто нулевое значение во время выполнения, потому что все эти классы генерируются ReportFactory
в классе ReportController
.
private Map<String,Object> generateReport(ReportInfo ri, ...) {
// some input validation
IReport report = ReportControllerFactory.getReportInstance( ri.getClassName() );
// ...
}
. Я знаю, что могу использовать аннотацию @Produces
вместе с другим пользовательскиманнотации в ReportControllerFactory
, но как использовать @Inject
для переменной, которая может быть создана только после некоторой проверки, внутри метода?И как бы я передал параметр ri.getClassName()
?Объект ri
неизвестен, когда строится * 1016. *.
Большое спасибо!
С уважением, Себастьян
Редактировать в 08 июля 2011 г. (10:00):
Класс ReportFactory:
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 к контроллеру отчетов.ManagedBean вызывает сессионный компонент, который имеет несколько методов, в зависимости от того, какая кнопка была нажата и где.Все эти методы устанавливают имя отчета и вызывают более общий метод sendOrGetReport
.Этот метод выбирает уникальный ключ для указанного отчета из базы данных и решает, отправить электронное письмо или немедленно доставить отчет.Давайте предположим, что это должно быть доставлено.
Тогда ReportController
вступает в игру.Он выбирает объект ReportInfo
на основе уникального ключа и другой информации, предоставленной описанными выше методами, и вызывает ReportFactory
, чтобы создать отчет типа ri.getClassName()
.
Необычно, а?Я думаю, что весь этот раздел может нуждаться в рефакторинге.Если вы не видите легкого места, я пропускаю @Inject
в реализации отчета и выполняю поиск JDNI для этого ресурса.