Jakarta ee Weblogic 12.2忽略@EJB注释
我正在将一个应用程序从weblogic 10.3迁移到weblogic 12.2 我包括一个与其他项目共享的库。此jar包含一些带有@EJB注释的POJO,如下所示: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
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中。非常感谢您的回答!