使用@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
相关产品推荐
相关产品推荐

