我想让CDI“选择”一个替代类作为接口的实现。
虽然一切都捆绑在EAR中,但是替代实现将在war文件中,其余的(注入接口的类、接口、接口的“默认”实现)将在ejb jar中。
下面是一些代码来说明:
EJB 模块:
public interface I {}
public class C implements I {}
public class A {
@Inject I var
public void test() {
System.out.println(var instanceof C); // I want to have here as Result: false
}
}
战争模块:
@Alternative
public class D implements I {}
在战争文件中设置豆子.xml没有帮助。
从CDI 1.1开始。您可以使用@Priority,以便在全局上下文中发现您的替代方案——参见这里的依赖注入和编程查找
如果你使用@优先级,你不需要在beans.xml中声明替代方案-请参阅此处在CDI应用程序中使用替代方案
对于你所描述的结构,没有办法获得想要的注射。
EJB类装入器将永远无法访问WAR内部的类,因此注入永远不会考虑替代实现。
如果您愿意改变 EAR 结构,将备选项 (D) 与适当的 bean 一起放在 lib/jar 中,则可以找到解决方案.xml
。D 类将对 EJB 和 WAR 可见,并且注入 shoul 将根据需要继续进行。
你发布的解决方案,我在这里描述的,几乎是可行的。
EAR
- ejb-module-1.jar
- A.class (@Inject I)
- I.class
- C.class (@Stateless implements I)
- META-INF/beans.xml
- ejb-module-2.jar
- D.class (@Alternative @Stateless implements I)
- META-INF/beans.xml (<alternatives><class>D</class></alternative>)
- app.war
- calls A.test()
- WEB-INF/beans.xml
唯一的问题是您放错了< code>beans.xml替代声明的位置。
CDI规范(1.1,但也适用于之前的实施)在第5.1章中规定:
对于模块中的类或JSP/JSF页面的注入、查找或EL解析,替代项不可用,除非该模块是bean档案,并且在该bean档案中显式选择了替代项。
换句话说,您必须在使用bean的类的同一个模块中选择替代项。
以下是修订后的(和工作)结构:
EAR
- ejb-module-1.jar
- A.class (@Inject I)
- I.class
- C.class (@Stateless implements I)
- META-INF/beans.xml (<alternatives><class>D</class></alternative>)
- ejb-module-2.jar
- D.class (@Alternative @Stateless implements I)
- META-INF/beans.xml (empty <beans></beans>)
- app.war
- calls A.test()
- WEB-INF/beans.xml (empty <beans></beans>)
还要记住,尽管对于标准 bean,替代选择仅适用于 witch 中的模块,但替代选项在 bean 中声明.xml
,但对于 EJB 则不然。因此,您的 D
替代方案(@Stateless
)对整个应用程序有效。
< code >转换器希望使用由< code>ConfigProducer生成的注入< code >配置。其中< code>ConfigProducer在WAR中,但< code > converter 和< code>Config在jar中。遗憾的是,似乎没有注入< code>config导致< code > javax . EJB . EJB exception:javax . persist
我有一个问题是将EJB注入到抽象类中,抽象类是我JSF CDI bean的父类。在我的项目中,我使用MyFaces CODI 1.0.5(ViewScope),Omniface 1.3,PrimeFaces 3.4.2和GlassFish3.1.2。 应用程序是一个EAR,抽象类位于EJB模块中,JSF CDI bean位于WAR模块中: 我的抽象类: 我的CDIBean: 当我部署应用程序并访问
CDI bean: 当我现在访问无状态EJB(例如从servlet访问)时,我希望testMethod使用与调用方的HttpSession相关联的CDI bean。因此,如果来自不同Browser/HTTP会话的两个客户机访问Servlet,它们都将得到不同的结果字符串。 我是否需要CDI而不是?如果需要,我如何为给定会话生成正确的bean实例?我想过也许可以使用BeanManager并搜索Ses
我有一个叫做Container的类: ServiceB依赖于ServiceA: 在我的应用程序中可以有几个容器。现在,有没有什么诀窍可以将这个已经被注入到与ServiceB相同的容器实例中的ServiceA实例注入到ServiceB中呢?
我有几个EJB3。x无状态会话bean,未定义接口。我需要将这些bean注入到Springbean中,但我无法这样做。 无接口EJB: 我的豆子: 还有我的豆子。xml 在初始化Spring容器时,我得到以下错误: 异常本身非常清楚——spring容器期望MyBean有一个本地接口视图作为其业务接口;但是,我没有(也不能介绍)。 非常感谢您的帮助!
将遗留项目迁移到雅加达 EE 8(在 Wildly 26 上构建 Maven EAR)我正在努力使依赖项注入从我的实体模块(EJB 打包)工作到 WAR 模块,maven 项目结构是: 该结构是基于Wildfly-jakartaee8-with-tools原型创建的 我要注入的DAO是一个@Stateless豆,它使用@LocalBean无接口例如。 我的 CDI 代码是 WAR 模块中的标准@R