10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CDIを使うときのbeans.xmlの置き場所メモ

10
Last updated at Posted at 2013-10-13

ちゃんと理解せずに使ってたら、ハマったのでメモ。

環境

APサーバ

GlassFish 4.0

言葉の定義

InjecteeClass

インジェクション対象のクラス。

InjecteeClass
public class InjecteeClass {
}

TargetClass

インジェクション先のクラス。

TargetClass
public class TargetClass {
    @Inject
    private InjecteeClass injectee;
}

beans.xml の置き場所

InjecteeClass のある場所に応じて配置する。

InjecteeClass

  • WEB-INF/classes 以下にある場合は WEB-INF 直下
  • WEB-INF/lib 以下の jar ファイル内に格納されている場合は、その jar 内の META-INF 直下

に配置する。

InjecteeClass と TargetClass が両方とも WEB-INF/classes 以下にある

 →  WEB-INF 直下に配置。

webapp
└─WEB-INF
    │  beans.xml
    │
    └─classes
        └─cdi
            └─test
                    InjecteeClass.class
                    TargetClass.class

InjecteeClass が jar 内にあり、 TargetClass は WEB-INF/classes 以下にある

 → InjecteeClass の入っている jar ファイル内の META-INF 直下に配置する。

webapp
└─WEB-INF
    ├─classes
    │  └─cdi
    │      └─test
    │              TargetClass.class
    │
    └─lib
        └─test.jar
            ├─cdi
            │  └─test
            │          InjecteeClass.class
            │
            └─META-INF
                    beans.xml

InjecteeClass と TargetClass が両方とも jar 内にある

 → InjecteeClass の入っている jar ファイル内の META-INF 直下に配置する。

webapp
└─WEB-INF
    └─lib
        ├─fuga.jar
        │  └─cdi
        │      └─test
        │              TargetClass.class
        │
        └─hoge.jar
            ├─cdi
            │  └─test
            │          InjecteeClass.class
            │
            └─META-INF
                    beans.xml

TargetClass が JAX-RS のサービスクラスの場合

TargetClass が JAX-RS のサービスクラスで、かつ jar ファイル内に入っている場合は、その jar ファイルにも beans.xml が必要っぽい。

TargetClass
@Path("target")
public class TargetClass {
    @Inject
    private InjecteeClass injectee;

    @GET
    public String method() {
        return "test";
    }
}
webapp
└─WEB-INF
    └─lib
        ├─fuga.jar
        │  ├─jaxrs
        │  │  └─test
        │  │          TargetClass.class
        │  │
        │  └─META-INF
        │          beans.xml
        │
        └─hoge.jar
            ├─cdi
            │  └─test
            │          InjecteeClass.class
            │
            └─META-INF
                    beans.xml

たぶん、 TargetClass を CDI コンテナ管理にするために beans.xml が必要になるのではないかなと想像。

おまけ

InjecteeClass が EJB だと、 beans.xml は不要。

EjbClass
@Stateless
public class EjbClass {
}
TargetClass
public class TargetClass {
    @Inject
    private EjbClass ejb;
}
beans.xmlは不要
webapp
└─WEB-INF
    ├─classes
    │  └─cdi
    │      └─test
    │              TargetClass.class
    │
    └─lib
        └─test.jar
            └─ejb
                └─test
                        EjbClass.class

参考

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?