Java EE 6.0 プロジェクトでは、テスト対象の Bean が多数あります。追加情報を取得し、追加のテスト プローブを配置するために、非常にうまく機能する CDI の @Specializes アノテーションを使用します。@Specializes アノテーションを持つ Bean は、親クラスの Bean を置き換えます。
たとえば、次の 2 つの Bean があります。
@Stateless
public class Bean extends ... {}
@Specializes
public class BeanMock extends Bean {}
通常の注射では、これは非常にうまく機能します。あ
@Inject
private Bean bean;
BeanMock を Bean にします。
あるテストでは、JNDI を介して「Bean」と呼ばれる Bean にアクセスします。このテストは例外をもたらします:
14:29:07,867 ERROR [fail] (MSC service thread 1-3) MSC00001: Failed to start service jboss.deployment.unit."XXX.ear".WeldService: org.jboss.msc.service.StartException in service jboss.deployment.unit."XXX.ear".WeldService: org.jboss.weld.exceptions.DefinitionException: WELD-000047 Specializing bean must extend another bean: Managed Bean [class xxx.BeanMock] with qualifiers [@Any @Default]
at org.jboss.as.weld.services.WeldService.start(WeldService.java:83)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_31]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_31]
at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_31]
Caused by: org.jboss.weld.exceptions.DefinitionException: WELD-000047 Specializing bean must extend another bean: Managed Bean [class xxx.BeanMock] with qualifiers [@Any @Default]
at org.jboss.weld.bean.ManagedBean.preSpecialize(ManagedBean.java:449)
at org.jboss.weld.bean.AbstractBean.initialize(AbstractBean.java:121)
at org.jboss.weld.bean.AbstractClassBean.initialize(AbstractClassBean.java:196)
at org.jboss.weld.bean.ManagedBean.initialize(ManagedBean.java:322)
at org.jboss.weld.bootstrap.AbstractBeanDeployer.deploy(AbstractBeanDeployer.java:115)
at org.jboss.weld.bootstrap.BeanDeployment.deployBeans(BeanDeployment.java:204)
at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:344)
at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:82)
at org.jboss.as.weld.services.WeldService.start(WeldService.java:76)
... 5 more
可能であれば、JNDI 経由で「BeanMock」を取得したいと考えています。;-)
その場合の定義された動作は何ですか。私はすでに JSR299 を調べましたが、JNDI を介して @Specializes Bean で何が起こるかわかりませんでした。それらも交換されていますか?