ちゃんと理解せずに使ってたら、ハマったのでメモ。
環境
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