5

我在我的应用程序中使用带有加载时间编织的 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());
    }
}

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

关于我做错了什么有什么建议吗?

谢谢。

4

2 回答 2

6

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

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

于 2010-11-15T12:28:26.807 回答
3

另请参阅https://bugs.eclipse.org/bugs/show_bug.cgi?id=317874 上的邮件列表讨论和错误报告。我同意直觉@Configurable上servlet上的注释应该足以向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 类被调用之前对其进行检测加载。

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

于 2010-12-07T17:28:11.360 回答