@Inject在@WebServlet中失效,依赖对象为null问题求助
解决@Inject注入RegisterBean为null的问题
出现Cannot invoke "appuser.model.RegisterBean.setFirstName(String)" because "this.registerBean" is null错误的核心原因是CDI容器无法实例化并注入RegisterBean,具体问题及解决方案如下:
问题分析
- RegisterBean不是CDI托管Bean:没有添加CDI作用域注解,容器不会识别并管理这个类,自然无法完成注入。
- 缺少无参构造函数:CDI容器默认通过无参构造函数实例化Bean,你的RegisterBean只有带参数的构造函数,容器无法创建实例。
- (可选)轻量容器未启用CDI支持:如Tomcat这类轻量容器默认不支持CDI,需额外配置才能启用依赖注入功能。
解决方案
步骤1:修改RegisterBean,使其成为CDI托管Bean
添加CDI作用域注解(推荐@RequestScoped,匹配请求级别的数据载体场景),并补充无参构造函数:
package appuser.model; import javax.enterprise.context.RequestScoped; @RequestScoped public class RegisterBean { private String firstName; private String lastName; // 必须添加无参构造函数,供CDI容器实例化 public RegisterBean() { } public RegisterBean(String firstName, String lastName, String email, String password) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
步骤2:确保RegisterDao也是CDI托管Bean
为RegisterDao添加合适的作用域注解(推荐@ApplicationScoped,适合全局复用的数据访问类):
package appuser.model; import javax.enterprise.context.ApplicationScoped; @ApplicationScoped public class RegisterDao { public String authorizeRegister(RegisterBean registerBean) { // 你的业务逻辑实现 return "success"; // 示例返回值 } }
步骤3:为轻量容器(如Tomcat)启用CDI支持
如果使用Tomcat这类不默认支持CDI的容器,需补充以下配置:
- 添加Weld Servlet依赖(Maven):
<dependency> <groupId>org.jboss.weld.servlet</groupId> <artifactId>weld-servlet-core</artifactId> <version>3.1.9.Final</version> </dependency>
- 在
WEB-INF目录下创建beans.xml文件(空文件即可,触发CDI容器初始化):
<?xml version="1.0" encoding="UTF-8"?> <beans 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/beans_2_0.xsd" version="2.0" bean-discovery-mode="all"> </beans>
验证说明
完成上述修改后,CDI容器会自动实例化RegisterBean和RegisterDao并注入到Servlet中,registerBean将不再为null,可正常调用其set方法完成数据赋值。
内容的提问来源于stack exchange,提问作者F.M
相关产品推荐
相关产品推荐

