当前位置: 首页 > 知识库问答 >
问题:

如何将带有来自WAR的CDI的@Alternative注入EJB模块

徐德海
2023-03-14

我想让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没有帮助。

共有2个答案

麹渊
2023-03-14

从CDI 1.1开始。您可以使用@Priority,以便在全局上下文中发现您的替代方案——参见这里的依赖注入和编程查找

如果你使用@优先级,你不需要在beans.xml中声明替代方案-请参阅此处在CDI应用程序中使用替代方案

鲁泰宁
2023-03-14

对于你所描述的结构,没有办法获得想要的注射。

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