2010-11-15 26 views
5

Estoy usando Spring framework (2.5.4) en mi aplicación con Load time weaving y todo funciona bien en todas partes (en Spring beans, en entidades que no son Spring), excepto cuando trato de autoconectar el campo en un servlet anotado como @Configurable, cuando me siento un buen NullPointerException ...Spring @Autowired en Servlet


@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" /> 

Cualquier sugerencia acerca de lo que estoy haciendo mal?

Gracias.

+1

No estoy seguro, pero puede ser porque la clase de servlet es cargada por el contenedor de servlet y no por el contenedor de resorte. –

+2

@ abhin4v: La idea detrás del entrelazado en tiempo de carga es permitir que cualquier cosa cargue la clase, no solo por Spring. – skaffman

+0

@malejpavouk, ¿cuál es la solución final para dicho comportamiento? ¿Puedes compartirlo? –

Respuesta

3

Consulte también mailing list discussion y informe de errores en https: // bugs.eclipse.org/bugs/show_bug.cgi?id=317874. Estoy de acuerdo en que intuitivamente la anotación @Configurable en el servlet debería ser suficiente para indicar al marco de resorte que el servlet cuando se crearon las instancias se configurará por resorte, cuando se usa <context:spring-configured/>. También he observado que el comportamiento deseado se puede lograr cuando se utiliza -javaagent: /path/to/aspectjweaver.jar en lugar de spring-instrument * .jar o spring-agent.jar. Plantee un problema con Spring Jira en https: // jira.springframework.org/browse/SPR. Creo que el problema puede ser que la clase servlet, no una instancia del servlet, sino la propia clase, se cargue antes de llamar al ContextLoaderListener de primavera, por lo que el marco de primavera no tiene la oportunidad de instrumentar la clase de servlet antes de que sea cargado.

La instrumentación de resorte para cargar-tiempo-tejido parece estar basada en poder transformar el bytecode de clase antes de que se cargue. Si el contenedor del servlet se mantiene en una instancia del objeto Class que se obtuvo antes de ser transformado por la primavera, entonces (el contenedor del servlet) no podría producir instancias de la clase transformada, ni la primavera podría instrumentar instancias creado utilizando los métodos de fábrica en ese objeto Clase.

+0

https://jira.springsource.org/browse/SPR-7801 – malejpavouk

6

Esto es probable porque el Servlet está siendo instanciado e inicializado por el contenedor de servlets, antes de se está inicializando el contexto de Spring, y es el contexto Spring el que maneja el entrelazado en tiempo de carga.

¿Está su contenedor <context:load-time-weaver/> dentro del servlet Spring context/o en el nivel de aplicación web? El primero seguramente no funcionará (por las razones especificadas anteriormente), pero una configuración de nivel de aplicación puede funcionar (usando ContextLoaderListener).

+0

Estoy usando contextLoaderLister en web.xml ... y parece que algunos beans, que se inyectaron correctamente se crean antes del servlet ... – malejpavouk

+0

el contexto: la etiqueta load-time-weaver se encuentra en el archivo de configuración de primavera. .No sé si es importante, pero estoy usando spring-agent para instrumentar mi código – malejpavouk

Cuestiones relacionadas