【问题标题】:@Specializes and JNDI in Java EE CDIJava EE CDI 中的@Specializes 和 JNDI
【发布时间】:2012-07-23 12:45:17
【问题描述】:

在 Java EE 6.0 项目中,我们有很多 bean 在测试中。为了获得一些额外的信息并放置额外的测试探针,我们使用了 CDI 的 @Specializes 注释,它工作得很好。带有@Specializes 注解的 Bean 替换了它们的父类 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,但没有发现 @Specializes bean 通过 JNDI 会发生什么。他们也被替换了吗?

【问题讨论】:

  • 似乎是因为您在这里使用 EJB 而您的 BeanMock 不是 EJB。
  • 感谢您的评论。我认为,无状态 bean 注释被继承到模拟。至少在我写过的其他情况下。我没有在类中添加另一个无状态注释,它通过普通注入工作。我明天可以试一试,看看另一个无状态注释是否有所作为。
  • 您找到解决方案了吗?我也有同样的问题...
  • 不,从来没有直接找到解决方案。我们所做的是,我们提供了一个自己的 CDI 提供程序实现,以便为存在具有针对某个接口的自己的 @Mock 注释的实现的类提供特殊的模拟类。在 CDI 扫描期间,我们交换了这些实现。对于我们的测试,不再需要 JNDI 查找,我们解决了这个问题。

标签: jakarta-ee java-ee-6 jndi cdi


【解决方案1】:

我会尝试使用 CDI 范围(应用程序、会话、请求)之一来确定您的 ejb 范围,或者至少添加 @Named 注释,以查看它是否会被视为 CDI bean。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 2015-07-29
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多