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

@Inject在@WebServlet中失效,依赖对象为null问题求助

解决@Inject注入RegisterBean为null的问题

出现Cannot invoke "appuser.model.RegisterBean.setFirstName(String)" because "this.registerBean" is null错误的核心原因是CDI容器无法实例化并注入RegisterBean,具体问题及解决方案如下:

问题分析

  1. RegisterBean不是CDI托管Bean:没有添加CDI作用域注解,容器不会识别并管理这个类,自然无法完成注入。
  2. 缺少无参构造函数:CDI容器默认通过无参构造函数实例化Bean,你的RegisterBean只有带参数的构造函数,容器无法创建实例。
  3. (可选)轻量容器未启用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的容器,需补充以下配置:

  1. 添加Weld Servlet依赖(Maven):
<dependency>
    <groupId>org.jboss.weld.servlet</groupId>
    <artifactId>weld-servlet-core</artifactId>
    <version>3.1.9.Final</version>
</dependency>
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:35:05