Pregunta

Estoy utilizando el framework Spring (2.5.4) en mi aplicación con el tejido tiempo de carga y todo funciona bien en todas partes (en los granos de la primavera, en las entidades no-primavera), excepto cuando intento Autowire campo en un servlet anotado como @ configurable, cuando me siento un buen 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" />

¿Alguna sugerencia sobre qué estoy haciendo mal?

Gracias.

¿Fue útil?

Solución

Ver también lista de correo discusión y reporte de errores en la dirección https: // bugs.eclipse.org/bugs/show_bug.cgi?id=317874. Estoy de acuerdo que intuitivamente la anotación @Configurable en el servlet debería ser suficiente para indicar que el marco de primavera que el servlet cuando se crea una instancia estará configurado para la primavera, cuando se utiliza <context:spring-configured/>. También he observado que el comportamiento deseado es alcanzable cuando se utiliza el -javaagent: /path/to/aspectjweaver.jar en lugar de primavera-instrumento * .jar o primavera-agent.jar. Por favor plantear un problema con la primavera Jira en https: // jira.springframework.org/browse/SPR. Creo que el problema puede ser que la clase servlet - no una instancia del servlet, pero la clase en sí - se carga antes de la ContextLoaderListener primavera se llama, por tanto, el marco de primavera no tiene la oportunidad de instrumento de la clase servlet antes de que sea cargado.

La instrumentación de muelle para la carga en tiempo-tejer parece basarse en la posibilidad de transformar el código de bytes de clase antes de ser cargado. Si el contenedor de servlet se está sosteniendo sobre una instancia de la clase de objeto que se obtuvo antes de que se transformó por el muelle, entonces (el contenedor servlet) no sería capaz de casos productos de la clase transformado, ni sería resorte capaz de casos de instrumentos creado usando los métodos de fábrica en ese objeto de clase.

Otros consejos

Esto es probablemente debido a que el servlet se crea una instancia e inicializado por el contenedor de servlets, antes el contexto de Primavera se está inicializando, y es el contexto de primavera, que se encarga de la tejer-tiempo de carga.

Es el <context:load-time-weaver/> cosas ser manija interior el contexto de Primavera servlet / o en el nivel de aplicación web? El primero es casi seguro que no va a funcionar (por las razones especificadas anteriormente), pero un trabajo de nivel de aplicación web config fuerza (usando ContextLoaderListener).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top