Spring @Autowired in Servlet

mal*_*ouk 5 java spring servlets autowired

我在我的应用程序中使用Spring框架(2.5.4)加载时间编织并且一切正常(在Spring bean中,在非Spring实体中),除非我尝试在注释为@Configurable的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());
    }
}
Run Code Online (Sandbox Code Playgroud)
<context:load-time-weaver/>
<context:spring-configured/>
<context:component-scan base-package="cz.flexibla2" />
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

ska*_*man 6

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

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


Lar*_*Chu 3

另请参阅https://bugs.eclipse.org/bugs/show_bug.cgi?id=317874 上的邮件列表讨论和错误报告。我同意直观上@Configurableservlet上的注释应该足以向spring框架表明servlet在实例化时将由spring配置,当使用<context:spring-configured/>. 我还观察到,使用 -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 类被调用之前对其进行检测。已加载。

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