【问题标题】:Weblogic 12.2 ignore @EJB annotationWeblogic 12.2 忽略@EJB 注解
【发布时间】:2017-09-14 13:40:50
【问题描述】:

我正在将应用程序从 weblogic 10.3 迁移到 weblogic 12.2。

我包含一个与其他项目共享的库。这个 jar 包含一些带有 @EJB 注释的 POJO,如下所示:

public abstract BaseSpecialService{
   @EJB DelegateService injectedService;
}

注意这只是一个 POJO:它没有 @Stateless 或 @Stateful 注释。 这个想法是当我想使用这个服务时,我在另一个 ejb-jar 中使用一个具体的@Stateless Bean 类来扩展它。但我只想为我需要的服务做这个,其他的服务应该被视为 POJOS。

在 weblogic 10 中这工作得很好,但是当迁移到 weblogic 12 时,我无法部署应用程序,因为容器尝试在上面的示例中注入 DelegateService,即使 @EJB 注释不在 EJB 中但在 POJO 中。我在部署时收到此错误:

[J2EE:160200]解析 ejb-ref 时出错 来自模块“null”的“com.example.BaseSpecialService/injectedService” 应用程序“myapp-0.1.0-SNAPSHOT”。 ejb-ref 没有 ejb-link 和目标 bean 的 JNDI 名称尚未指定。 尝试自动将 ejb-ref 链接到其目标 bean 失败 因为没有找到应用程序中的 EJB 来实现 “com.example.DelegateService”接口。将此 ejb-ref 链接或映射到 它的目标 EJB 并确保在 ejb-ref 中声明的接口是 正确。

我的解释是,在 java EE 7 中扫描所有 jar 以查找注释,而在 java EE 5 中,仅扫描 application.xml 中标记为 ejb 模块的 jar。我正在寻找一种方法来阻止应用程序服务器将依赖项注入我的 POJO 并将共享库 jar 视为普通 jar,而不是 ejb-jar。但我找不到任何东西可以做到这一点。 非常感谢任何帮助。

【问题讨论】:

    标签: jakarta-ee ejb weblogic


    【解决方案1】:

    似乎 WebLogic 的 CDI 容器会扫描您的 jar 文件并尝试将 POJO/EJB 注入其中。我的建议是禁用给定 jar 文件的 CDI 扫描并查看结果。您可以通过添加一个名为 beans.xml 的文件来执行此操作,该文件包含以下内容并将其放入 jar 文件的 META-INF 文件夹中:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
        version="1.1" bean-discovery-mode="none">
    </beans>
    

    【讨论】:

    • 感谢您的回复。不幸的是,这并没有帮助:(我还尝试在 application.xml 中明确地将 jar 标记为 模块,但这并没有改变任何东西。我会将 jar 重构为更小的 jar 并尝试以这种方式部署
    • 最终证明您的解决方案是正确的。我只是将 beans.xml 放在错误的位置:它必须包含在包含由 CDI 拾取的注释的类的 jar 中,而不是包含在使用这些 jar 的 war/ejb jar 中。非常感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    相关资源
    最近更新 更多