「//fix this/」の記事インデックス

//fix this/ Javaコードの間違いをさがせ!


このシリーズは、あなたのコーディング・スキルを試すコーナーです。毎号オラクルのJavaエバンジェリストたちが、Javaコードに関する難問を出題し、正解と解説を掲載します。是非、毎号チャレンジして貴方のコーディング能力の向上にお役立て下さい。


第1回目 (Java Magazine 2011/Nov-Decより出題)


1. 今回のテーマ 「CDI」 

Contexts and Dependency Injection(CDI)は、Java EE 6プラットフォームで新たに導入された仕様です。この仕様では、Webアプリケーションへの型保証(type-safe)された標準ベースの依存性注入について定義されています。CDIでは、JSFとEJBのプログラ ミング・モデルを統合し、EJBをJSF バッキングBeanとして使用できるようにすることでWebとトランザクション層とのギャップを埋めています。



2. コード

JSF バッキングBean用の次のコードについて考察します。


@Named @Stateless
public class MyBean {
  public void save() {
    // データベースへの永続化のためのビジネス・ロジック
  }
}

WAR構造は次のようになります。


WEB-INF/classes
               /MyBean
index.xhtml


3.正しいのはどれ?

@Namedを使用すると、JSFページ用のxhtmlファイルで、式言語 #{myBean.save}でこのBeanにアクセスできます。しかし、このプログラムでは、JSFページにEJBをインジェクションできません。その理由は以下のどれでしょうか。

1) EJBでインジェクションを有効にするには、EJBをJARファイルまたはEARファイルにパッケージ化する必要がある。

2) インジェクションを有効にするには、「beans.xml」が必要である。

3) EJBのビジネス・メソッドを呼び出すには、そのパラメータとしてActionEventが必要となる。

4) CDIインジェクションは仕様で定義されたクラスからは利用できない。

<ヒント>
これは、CDI対応アプリケーションの構築時にもっともよく見られる間違いです。






【答え】

正解は、2)です。インジェクションを有効にするために「beans.xml」が必要です。
CDI仕様は、beanインジェクションを稼動させるためにWEB-INFディレクトリの”beans.xml”を必要とします。なので、たとえコードに問題がなくても、ファイルが足りないと、EJBインジェクションを動作させることができません。


第2回へ進む >>

「//fix this/」の記事インデックス