我在我的应用程序中使用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" />
关于我做错了什么的任何建议?
感谢。
答案 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对象上的工厂方法创建。