1

在我第一次涉足 JSF 和 CDI 世界时,我一直在尝试使用 @Specializes 批注来仅在单元测试中覆盖托管 bean 中的行为。我们在 WEB-INF/lib 中有 MyFaces CODI jar,并且单元测试方面工作得很好,即我的 Mock 专业化被拾取并使用:

@ProjectStageActivated(ProjectStage.UnitTest.class)
@Specializes
class MockCustomerSearchScreenBean extends CustomerSearchScreenBean {
...

当项目阶段确实是单元测试时,这很好用,但是当它是其他任何东西时,WAR 启动失败并出现

org.apache.webbeans.exception.WebBeansDeploymentException: org.apache.webbeans.exception.inject.InconsistentSpecializationException: Specialized bean for class : class bla.bla.MockCustomerSearchScreenBean is not enabled in the deployment.
    at org.apache.webbeans.config.BeansDeployer.checkSpecializations(BeansDeployer.java:653)

我知道 @Observes ProcessAnnotatedType 在 bean 发现期间触发,因为我可以看到 CODI ActivationExtension 在 ProcessAnnotatedType 上设置了否决标志,并且我还编写了自己的扩展,明确否决了 Mock 版本,但容器仍然确定尝试使用专用版本,而不是“普通”版本。我还尝试包装 AnnotatedType 以不宣传 @Specialization 注释。

我也没有简单的方法不将模拟子类部署到我的桌面服务器。

有什么方法可以说服 WebSphere 的开放 Web bean 版本忽略基于项目阶段的专业化(或我可以控制的其他一些因素)?

4

1 回答 1

0

WAS 8.0 使用了相当老的 OpenWebBeans 版本。这个问题很久以前就在 OpenWebBeans 中修复了。我会搬到8.5+。和/或使用@Alternative 尝试相同(但关闭BDA)。

于 2012-12-30T19:34:13.567 回答