将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
相关产品推荐
相关产品推荐

