【问题标题】:CDI cross BDA bean injection in Wildfly 8.1Wildfly 8.1 中的 CDI 交叉 BDA bean 注入
【发布时间】:2014-08-24 17:45:07
【问题描述】:

我有一个结构如下的 EAR 文件:

    • jar.jar
      • 测试1
      • 测试2
  • ejb.jar
    • Test1Impl
  • war.war
    • Test2Impl
    • TestServlet

jar.jar 包含两个接口

  • 测试1
  • 测试2

只有当我在 war.war 中有一个清单类路径条目到 ejb.jar 时,TestServlet 才会注入解析为 Test1Impl 的 Test1。 只有当我在 ejb.jar 中有一个清单 Class-Path 条目到 war.war 时,Test1Impl 才会注入解析为 Test2Impl 的 Test2。

Weld documentation 的提示条目为部署匹配类加载器结构解释了为什么我需要清单条目。 这种交叉 BDA 注入应该如何正常工作?添加 Class-Path 清单条目似乎有点愚蠢,因为实际上我不希望实现可见。我只希望其他子部署中的 bean 可见。有什么办法吗?

这里是实现

public class Test1Impl implements Test1 {

    @Inject
    private Test2 test2;

    public void hello() {
        System.out.println(test2.getString());
    }

}

public class Test2Impl implements Test2 {

    public String getString() {
        return "Hello";
    }

}

@WebServlet(urlPatterns = "/test")
public class TestServlet implements Servlet {

    @Inject
    private Test1 test;

    public void init(ServletConfig config) throws ServletException {
    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        test.hello();
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {
    }

}

这里是application.xml

<?xml version="1.0" encoding="UTF-8"?>
<application 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/application_7.xsd"
             version="7">
  <description>The EAR</description>
  <display-name>ear</display-name>
  <module>
    <ejb>ejb.jar</ejb>
  </module>
  <module>
    <web>
      <web-uri>war.war</web-uri>
      <context-root>/</context-root>
    </web>
  </module>
  <library-directory>lib</library-directory>
</application>

【问题讨论】:

  • 您是否为Test1ImplTest2Impl 定义了任何范围?你的beans.xml 是什么样的?
  • 在我的真实应用程序中,Test1Impl 是一个无状态的 EJB,Test2Impl 是一个请求范围的 CDI bean。 beans.xml 为空。
  • 您能否更新您的问题以指定您的application.xml 的外观?

标签: cdi wildfly weld wildfly-8 weld2


【解决方案1】:

正如CDI reference从部署外部使用CDI Bean一节中所述,需要具有适当依赖关系的jboss-deployment-structure.xml。 虽然这样做解决了我的问题,但我认为 CDI 规范应该为企业应用程序定义一种可移植的方式。

【讨论】:

  • 该部分仅与不包含在同一部署中的档案有关。出于所有意图和目的,您应该将 EAR 视为一个部署。
  • 虽然你对 not contains 部分是正确的,但是页面的后续部分 JBoss Deployment Structure File Class Loading in WildFly 对 EAR 中包含的 ejb 模块使用 meta-inf 导入。如果我不需要配置它会很棒,因为正如您所写,EAR 应该被视为一个部署,但不幸的是,这并没有按预期工作。
猜你喜欢
  • 1970-01-01
  • 2014-06-02
  • 2014-04-23
  • 2015-04-15
  • 2015-02-12
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
相关资源
最近更新 更多