You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@EJB注解注入DAO仍为null的Java EE问题求助

解决@EJB注入DAO实例为null的问题

针对你遇到的@EJB注入后实例为null的问题,结合你的代码和环境(GlassFish 7 + Jakarta EE),以下是具体的修复步骤:

1. 补充实现IUserDAOLocal的EJB类

你的代码中只有泛型的GenericFacade实现了IGenericDao,但没有具体的EJB类实现IUserDAOLocal接口,容器找不到对应的EJB实例来完成注入。需要新增一个UserDAO类:

@Stateless
public class UserDAO extends GenericFacade<User> implements IUserDAOLocal {
    // 无需额外代码,直接继承GenericFacade的所有实现逻辑
}

2. 修正EJB依赖的API版本

你当前使用的javax.ejb:ejb-api:3.0是Java EE 6的旧版本,而GlassFish 7基于Jakarta EE 10,API包名已经从javax迁移到jakarta,版本不兼容会导致容器无法识别@EJB注解。修改pom.xml中的EJB依赖:

<!-- 替换原来的javax.ejb依赖 -->
<dependency>
    <groupId>jakarta.ejb</groupId>
    <artifactId>jakarta.ejb-api</artifactId>
    <version>4.0.0</version>
    <scope>provided</scope>
</dependency>

3. 修复persistence.xml的数据源配置

你的jpa-test2持久化单元中,jta-data-source的值前后有空格,会导致容器无法匹配到正确的数据源:

<!-- 去掉前后空格 -->
<jta-data-source>jdbc/JPABDD</jta-data-source>

同时要确认GlassFish服务器中已经正确配置了名为jdbc/JPABDD的JDBC数据源,包括数据库连接URL、用户名密码等信息,且状态为可用。

4. 验证打包与部署

  • 确保所有EJB类(UserDAO、GenericFacade)、实体类、接口都被正确打包到war包的WEB-INF/classes目录下
  • 重新部署war包到GlassFish,查看服务器日志是否有EJB部署成功的提示,比如类似EJB UserDAO deployed successfully的信息

额外排查点

  • 检查GlassFish日志是否有类加载错误、数据源连接失败等异常,这些问题会间接导致EJB注入失败
  • 确保Servlet是由容器管理的,不要手动创建Servlet实例(你的@WebServlet注解是正确的,容器会负责初始化)
  • 确认IUserDAOLocal的@Local注解使用正确,同一容器内的组件注入本地接口是最优选择,无需使用@Remote

内容的提问来源于stack exchange,提问作者Milena Milena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:19:53