Spring @Autowired in Servlet

时间:2010-11-15 12:08:25

标签: java spring servlets autowired

我在我的应用程序中使用Spring框架(2.5.4)和加载时间编织,一切正常(在Spring bean中,在非Spring实体中),除非我尝试在注释为@的servlet中自动装配字段可配置,然后我得到一个很好的NullPointerException ......


@Configurable(dependencyCheck=true)
public class CaptchaServlet extends HttpServlet{
    @Autowired
    private CaptchaServiceIface captchaService;

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    //    ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext());
    //    captchaService = (CaptchaServiceIface) ctx.getBean("captchaService");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Captcha c = captchaService.getCatpcha();
        req.getSession().setAttribute("captchaAnswer", c.getAnswer());
        resp.setContentType("image/png");
        ImageIO.write(c.getImage(), "png", resp.getOutputStream());
    }
}

<context:load-time-weaver/>
<context:spring-configured/>
<context:component-scan base-package="cz.flexibla2" />

关于我做错了什么的任何建议?

感谢。

2 个答案:

答案 0 :(得分:6)

这很可能是因为Servlet容器在初始化Spring上下文之前由实例化和初始化,并且它是处理加载时织入的Spring上下文。

你的<context:load-time-weaver/>内容是否在servlet Spring上下文/ webapp级别处理?前者几乎肯定不会起作用(出于上面指定的原因),但是webapp级配置可能有用(使用ContextLoaderListener)。

答案 1 :(得分:3)

另请参阅https:// bugs.eclipse.org/bugs/show_bug.cgi?id=317874上的mailing list discussion和错误报告。我同意直观地说,servlet上的@Configurable注释应该足以向spring框架指示当使用<context:spring-configured/>时,spring实例化的servlet将由spring配置。我还观察到,当使用-javaagent:/path/to/aspectjweaver.jar而不是spring-instrument * .jar或spring-agent.jar时,可以实现所需的行为。请通过https:// jira.springframework.org/browse/SPR向Spring Jira提出问题。我相信问题可能是servlet类 - 不是servlet的实例,而是类本身 - 在调用Spring ContextLoaderListener之前加载,因此spring框架没有机会在它之前检测servlet类。加载。

用于加载时编织的弹簧工具似乎基于能够在加载之前转换类字节码。如果servlet容器持有在Spring转换之前获得的Class对象的实例,那么它(servlet容器)将无法生成转换类的实例,也无法生成实例使用该Class对象上的工厂方法创建。