NetBeans 6.9 でCDIの対応が本気すぎて吹いた

NetBeans 6.9 RC2がでたようなので落とす。今回もほぼ日本語化されてますね。

http://www.linux-foundation.jp/content/2009osstools
にて、NetBeansが2008年では「導入実績あり」から、2009年Eclipseと同様の「導入実績多数」に昇格したというのはこの辺が関係あるきがします。


今回はCDIまわりについて。

CDIを有効にした状態でプロジェクトを作成し、JSFの管理Beanを新規作成するとできあがるのはJSFのManaged Beanではなく、CDIのクラスが生成される。ちょっとびびった。


だが、驚くのはそんなところではない。


まず以下のようなコードを書く。足し算をするクラスですね。

package bean;

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;

@Named(value="addCalc")
@RequestScoped
public class CalcBean {
    public int calc(int a,int b){
        return a + b;
    }
}

それを継承して掛け算するクラスを作ってみる。

package bean;

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named("mulCalc")
@RequestScoped
public class CalcBean2 extends CalcBean{
    @Override
    public int calc(int a, int b) {
        return a * b;
    }
}


そしてCalcBeanを注入。

package bean;

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;

@Named(value="hoge")
@RequestScoped
public class ManagedBean {

    @Inject
    private CalcBean calc;

    public int calc(int a,int b){
        return calc.calc(a, b);
    }
}

当たり前だが、CalcBean という型だけではあいまいなのでエラーが出る。

Glassfishなどアプリケーションサーバーの場合デプロイ時でははねられる。デプロイ後の実行ではねられるわけではないのがポイント。もちろんログはちゃんとでる。


注入する変数を右クリックしてナビゲートを見ると見慣れないものがある。
http://shin.cside.com/diary/2010/0605-01.png


「注入可能物を検査」を選択してみるとこんなウインドウが出ていろいろと調べることが出来る。
http://shin.cside.com/diary/2010/0605-02.png


「注入可能に移動」を選択すると可能な一覧が選択できる。これから選ぶと注入されるものへジャンプする。
http://shin.cside.com/diary/2010/0605-03.png

また、画面左下のステータスバーにあいまいだというメッセージが表示されている。
http://shin.cside.com/diary/2010/0605-04.png
なんともぎこちない日本語なのはご愛嬌だが、大体なんとなく言いたいことはわかる。


そこで注入箇所のあいまいさをなくしてみる。

    @Inject
    @Named("mulCalc")
    private CalcBean calc;

そうすると「注入可能に移動」でジャンプする先は1つだけなので選択肢が表示される瞬時に注入先に飛ぶ。先ほどのあいまいだというメッセージも出ない。


「注入可能物を検査」を選択しても表示されるのは1つのみ。
http://shin.cside.com/diary/2010/0605-05.png


インターフェースからあいまいな状態にしたのが以下の画面。
http://shin.cside.com/diary/2010/0605-06.png

継承関係やインターフェースを複雑に適用するってのは少ないと思うけど、参考になるかもしれない。この画面で何も表示されない場合は注入されるものが見つからないってことだから指定にミスがあるというのもすぐにわかる。実行せずに。


@Namedだけじゃなくて独自のQualifierを作成してもちゃんと注入されるものを探し出してくれるのも確認した。ソースが保存されていない状態で反映されてるので、NetBeans APIで動的にソース解析して探してきてくれてるみたい。ソースが増えたときどれくらい時間が掛かるようになるかはわからないけど、人間が手動で探すよりは早いはず。




よくインターフェースから実装先を探すといった汎用的な単純なものはあるのだが、ちゃんとアノテーションの動作を理解して、実行せずとも注入されるものを探してくるってのはものすごいことだと思う。

特に保守とかで他人の作ったコードを追うときに便利だよね?いままでだったらちゃんとフレームワークの挙動や設定を理解してやっと実装先がわかったという感じだったのがツールでさくっと探せるとなると…。