Jakarta ee Weblogic 12.2忽略@EJB注释

Jakarta ee Weblogic 12.2忽略@EJB注释,jakarta-ee,ejb,weblogic,Jakarta Ee,Ejb,Weblogic,我正在将一个应用程序从weblogic 10.3迁移到weblogic 12.2 我包括一个与其他项目共享的库。此jar包含一些带有@EJB注释的POJO,如下所示: public abstract BaseSpecialService{ @EJB DelegateService injectedService; } 注意,这只是一个POJO:它没有@Stateless或@Stateful注释。 其思想是,当我想使用此服务时,我在另一个ejb jar中使用一个具体的@Stateless

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

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

public abstract BaseSpecialService{
   @EJB DelegateService injectedService;
}
注意,这只是一个POJO:它没有@Stateless或@Stateful注释。 其思想是,当我想使用此服务时,我在另一个ejb jar中使用一个具体的@Stateless Bean类对其进行扩展。但我只想为我需要的服务提供这个,其他服务应该被视为POJO

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

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

我的解释是,在JavaEE7中,所有JAR都会被扫描以获取注释,而在JavaEE5中,只有在application.xml中标记为ejb模块的JAR才会被扫描。我正在寻找一种方法来阻止应用服务器向POJO中注入依赖项,并将共享库jar视为普通jar,而不是ejb jar。但我找不到任何东西来做这件事。
非常感谢您的帮助。

似乎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>

似乎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放在了错误的位置:它必须包含在包含类的jar中ing注释由CDI获取,而不是在使用这些jar的war/ejb jar中。非常感谢您的回答!感谢您的回答。不幸的是,这没有帮助:(我还尝试在application.xml中显式地将jar标记为模块,但这不会改变任何事情。我会将jar重构为更小的jar,并尝试以这种方式部署,最终证明您的解决方案是正确的。我只是将beans.xml放在了错误的位置:它必须包含在包含类的jar中ing注释由CDI获取,而不是在使用这些jar的war/ejb jar中。非常感谢您的回答!