3

ビューのコントローラーとして使用される JSF2 Bean があります。

@Named
@SessionScoped
public class PosController implements Serializable {

  @EJB FatturaFacade fatturaFacade;

  // ...
}

ご覧のとおり、EJB の 1 つ (dao ラッパーとして使用) をその中に注入することができますが、「単純な」オブジェクトを注入する方法は何ですか? そして、次のように異なる実装がある場合はどうなりますか?

interface Retriever;
class WebServiceRetriever implements Retriever;
class FileRetriever implements Retriever;

注釈を見ましたが、@interfaceよくわかりませんでした。

4

1 に答える 1

3

完全な Java EE 6 プラットフォームがあると仮定すると、最良のアプローチは CDI の@Inject.

最も単純なメカニズムは、具象型を使用することです。

public class Bean {
  @Inject
  private WebServiceRetriever webServiceRetriever;

  @Inject
  private FilesRetriever filesRetriever;

  //etc.

同じインターフェースの複数の実装では、@Qualifierアノテーションを作成できます。それらの使用法は、Java EE 6 チュートリアルの「修飾子の使用」セクションで説明されています。

@Files修飾子:

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Files {}

FileRetriever実装:

@Files
public class FileRetriever implements Retriever {}

Retrieverインジェクションターゲットの実装の曖昧さの解消:

public class Bean {
  @Inject @WebServices
  private Retriever webServiceRetriever;

  @Inject @Files
  private Retriever filesRetriever;

  //etc.

CDI での JSF の使用に関する私のブログの記事が参考になるかもしれません。

于 2013-01-01T17:12:14.413 に答える