【问题标题】:Java EJB Dependency Injection Fails On Apache Maven ModulesJava EJB 依赖注入在 Apache Maven 模块上失败
【发布时间】:2014-06-01 20:46:25
【问题描述】:

我正在尝试将 bean 注入程序的主类。我在 Apache Maven 下有两个模块:

- Java Parent
  - Module1
  - Module2

部分 pom 文件如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.screening</groupId>
<artifactId>screening</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<name>Java Parent</name>

<properties>
  <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<modules>
  <module>Module1</module>
  <module>Module2</module>
</modules>
</project>

模块1 pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

 <parent>
    <groupId>com.screening</groupId>
    <artifactId>screening</artifactId>
    <version>1.0-SNAPSHOT</version>
 </parent>

 <modelVersion>4.0.0</modelVersion>

<groupId>com.screening</groupId>
<artifactId>module1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>ejb</packaging>

<name>Module1</name>
</project>

我在 Module1 中有一个无状态的本地 bean:

@Stateless
@Local
public class JDBCProcessorBean implements JDBCProcessorBean {
  // implemented methods
}

我在同一个模块中注入这个类:

@Startup
@Singleton
public class Runner {

     @EJB
     private JDBCProcessor jdbcProcessor; // this is injected at runtime
}

JDBCProcessor 是在运行时注入的,我可以使用 JDBCProcessor 的方法。当我将 module2 bean 注入 Runner 类时,问题就出现了。它找不到我的课程。它再次具有@Stateless 和@Local。即使我尝试使用 @Remote 它仍然找不到它。我明白了

 javax.NamingNotFoundException

唯一的问题是注入不同模块中的 bean。如何解决这个问题?

【问题讨论】:

    标签: java dependency-injection ejb


    【解决方案1】:

    你还记得在另一个模块的 src/main/resources/META-INF 中添加一个 beans.xml 吗?

    --更新--

    它实际上不必包含任何 bean。应该拿起一个空的:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    </beans>
    

    【讨论】:

    • 没有。这个文件应该是空白的吗?
    • 我的答案中的格式有点奇怪,但这就是你所需要的。这将通知容器该模块包含 bean。
    • 我应该将此 beans.xml 添加到 module2 吗?我应该将它添加到 src/main/resources 并且 Apache Maven 会将它添加到 META-INF 吗?
    • 你说这是一个 Maven 项目。如果您将 META-INF 文件夹放入 src/main/resources,maven 会为您将其构建到 jar 中。是的,它应该放在提供 bean 的项目中。
    • 如果有帮助,这是另一个相关答案:stackoverflow.com/questions/13056336/…
    猜你喜欢
    • 2012-08-13
    • 1970-01-01
    • 2016-04-25
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    相关资源
    最近更新 更多