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

将Application Scoped类注入POJO时出现实例为空的问题

问题原因
  • 你在MyServlet里通过new Extra(null)手动创建了Extra实例,这个实例不受CDI容器管理,容器不会处理它的@Inject注解,加上你手动传入了null,最终导致Person引用为空。
  • 只有由CDI容器创建的实例(比如通过@Inject注入、JSF页面调用ManagedBean等场景),依赖注入逻辑才会生效。
解决方法

方法1:在Servlet中注入Extra,而非手动实例化

修改MyServlet,通过@Inject获取容器管理的Extra实例,让容器自动完成依赖注入:

@WebServlet("/hola")
public class MyServlet extends HttpServlet{

    @Inject
    Extra ex; // 由CDI容器注入Extra实例

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter wr = resp.getWriter();
        wr.print("Hola:"+ex.saludar());
    }
}

方法2:通过CDI API手动获取Extra实例(仅必要场景使用)

如果必须手动获取实例,可以借助BeanManager获取容器管理的Extra对象:

@WebServlet("/hola")
public class MyServlet extends HttpServlet{

    @Inject
    BeanManager beanManager;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取Extra的Bean定义
        Bean<Extra> extraBean = (Bean<Extra>) beanManager.resolve(beanManager.getBeans(Extra.class));
        CreationalContext<Extra> ctx = beanManager.createCreationalContext(extraBean);
        Extra ex = extraBean.create(ctx);

        PrintWriter wr = resp.getWriter();
        wr.print("Hola:"+ex.saludar());
    }
}
额外注意事项
  • 确保项目已正确启用CDI支持:在WEB-INF目录下添加空的beans.xml文件,激活CDI容器。
  • Extra上的@ManagedBean是JSF专属注解,若使用纯CDI环境,建议替换为CDI的@RequestScoped(包路径为javax.enterprise.context.RequestScoped),避免注解混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:52:37