normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

NetBeans 8.0.1 で JavaEE7 な CDI を利用する際の注意点

NetBeansJavaEE 開発にとってなくてはならない優秀な IDE だが、CDI を利用する場合に注意点が存在する。JavaEE6 以降ではすっかり主軸となった CDI についての注意点を紹介する。

新規プロジェクト作成時の注意点

新規プロジェクトから以下の「Webアプリケーション」を選んだ場合、CDI のライブラリに参照が張られない点だ。
f:id:waritohutsu:20141222115117p:plain

cdi-api.jar への参照が存在しないため、CDI を管理コンテナとして明示する以下のアノテーションが利用できない。

  • @javax.enterprise.context.RequestScoped
  • @javax.enterprise.context.SessionScoped
  • @javax.enterprise.context.ApplicationScoped

一方で、以下の JSF 2.0 の管理コンテナを利用するアノテーションは指定できてしまうので注意が必要だ(以下のアノテーションを利用しても、CDI の @Inject ではインスタンスを利用できない)。

  • @javax.faces.bean.RequestScoped
  • @javax.faces.bean.SessionScoped
  • @javax.faces.bean.ApplicationScoped

この辺りの情報は 大混乱に陥っているJavaEE 6のアノテーションに関する使い分けについて が詳しい。

どう解決したらいいの?

以下の様に新規プロジェクトから Maven の Web アプリケーションを選択し、pom.xml を記載して参照を解決すればよい。
f:id:waritohutsu:20141222115127p:plain

pom.xml は以下の様に記載する。CDI のバージョンが 1.2 よりも新しくなったら別途追記してほしい。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mycompany</groupId>
    <artifactId>MavenWebApp</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>MavenWebApp</name>

    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <version>1.2</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

/// 中略