【问题标题】:@Specializes for EJB@专门用于 EJB
【发布时间】:2015-08-18 22:50:15
【问题描述】:

我正在尝试专门化 EJB。我有

package com.foo.core; 
@Stateless
public class MyFacade { }

package com.foo.extension;    
@Specializes
@Stateless
public class MyFacade extends com.foo.core.MyFacade { }

在我看来,这应该可行,因为@Specializes 的含义是,CDI 应该忘记核心类,而是使用专门的类。我还发现了这个错误https://issues.jboss.org/browse/WELD-1451,这表明可以专门化 EJB。

但如果我尝试部署我的应用程序(我使用的是 Weblogic 12.1.3),我总是会得到

weblogic.utils.ErrorCollectionException:有 1 个嵌套错误: weblogic.j2ee.dd.xml.AnnotationProcessException:重复的ejb名称 找到“MyFacade”:bean 类上的注释“Stateless” com.foo.core.MyFacade 和 bean 类上的注释“无状态” com.foo.extension.MyFacade

我做错了吗?

谢谢!

【问题讨论】:

  • CDI 规范没有定义 EJB 规范的工作方式。即使您提到的缺陷已解决,与之相关的拉取请求也被拒绝了,所以我不确定是否确实为它修复了任何东西。如果你想专攻,我建议使用纯 CDI bean。
  • 我考虑将我的 EJB 更改为纯 CDI bean。但我需要声明性事务控制。我可以@Transactional,但这是 JEE7 的一部分,因此在 Weblogic 12.1.3 中不可用。
  • 正如 JohnAment 所说,@Specializes 是一个 CDI 功能及其规范,并没有定义如何使用 EJB。我使用 weblogic,我建议你,如果你要等待这种情况在 weblogic 中得到解决,这可能需要很长时间。因此,请尝试寻找另一种仅使用 CDI 规范的方法。
  • John 和 Adam,你们在向全世界宣布 CDI 规范之前真的阅读过它吗?我认为不是因为你完全错了。 CDI 规范已经明确表示,从 1.0 开始完全可以专门化 EJB:s 会话 bean。此外,它甚至需要 CDI 容器对 @EJB 带注解的注入点执行依赖注入。然而,大多数 Java EE 容器/服务器都有非常糟糕的代码库。这是诚实的,因为规格本身非常糟糕。应该完全删除 EJB 规范。
  • Ben,没有独立于提供商的方法可以通过检查 EJBException 来找出问题所在。因此,“容器管理的事务划分”是完全没有用的,因为一个严肃的应用程序总是需要弄清楚哪里出了问题以及如何处理它。 EJB:s 有很多问题,你最好忘记它的一切。

标签: ejb cdi java-ee-6


【解决方案1】:

您引用的异常消息是由名称冲突引起的,这与 CDI 没有直接关系:每个 EJB 可以由多个不同的 JNDI 名称寻址,其中一些(例如java:module/MyFacade)仅包括简单的类名,而不是包名。所以你不能在不同的包中拥有两个同名的 EJB。

添加 CDI 和 @Specializes 可能会阻止专用 EJB 出现在 CDI 容器中,但它仍然是 EJB。

您可以尝试重命名您的派生类 - 这应该可以解决重复名称问题,但我不确定它是否会解决您的整体问题。

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多