プロジェクトにCDI(Weld)を導入したかったのですが、手動で作成されたオブジェクトで問題が発生しました。
したがって、インターフェイスを実装するクラスがいくつかIReport
あり、注入する必要のあるフィールドがあります。これらのクラスはすべて、クラスReportFactory
内のによって生成されているため、これは実行時にnullになります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)に編集:
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フロントエンドからReportControllerに向かういくつかのパスによって選択されます。ManagedBeanは、どのボタンがどこで押されたかに応じて、いくつかのメソッドを持つセッションBeanを呼び出します。これらのメソッドはすべて、レポート名を設定し、より一般的なメソッドを呼び出しますsendOrGetReport
。このメソッドは、指定されたレポートの一意のキーをデータベースから選択し、電子メールを送信するか、すぐにレポートを配信するかを決定します。配達されるべきだとしましょう。
次に、ReportController
が登場します。ReportInfo
彼は、上記のメソッドによって提供された一意のキーとその他の情報に基づいてオブジェクトをフェッチし、を呼び出してReportFactory
タイプのレポートを作成しますri.getClassName()
。
ファンシーですね このセクション全体でリファクタリングが必要になると思います。簡単な場所が見つからない場合は@Inject
、レポートの実装をスキップして、そのリソースのJDNIルックアップを実行します。