2010-11-15 19 views
5

Sto usando Spring framework (2.5.4) nella mia app con Load time weaving e tutto funziona bene ovunque (in Spring bean, in entità non Spring), tranne quando cerco di eseguire il campo autowire in un servlet annotato come @Configurable, allora ottengo un bel NullPointerException ...Spring @Autowired in 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" /> 

Qualche suggerimento su quello che sto facendo in modo errato?

Grazie.

+1

Non sono sicuro, ma potrebbe essere perché la classe servlet sia caricata dal contenitore servlet e non dal contenitore della molla. –

+2

@ abhin4v: L'idea alla base della tessitura a tempo di caricamento è consentire a qualsiasi cosa di caricare la classe, non solo da Spring. – skaffman

+0

@malejpavouk, qual è la soluzione finale per questo tipo di comportamento, puoi condividerla? –

risposta

3

Vedere anche mailing list discussion e bug report all'indirizzo https: // bugs.eclipse.org/bugs/show_bug.cgi?id=317874. Sono d'accordo che intuitivamente l'annotazione @Configurable sul servlet dovrebbe essere sufficiente per indicare alla struttura a molla che il servlet in fase di istanziazione sarà configurato a molla, quando si utilizza <context:spring-configured/>. Ho anche osservato che il comportamento desiderato è raggiungibile usando -javaagent: /path/to/aspectjweaver.jar invece di spring-instrument * .jar o spring-agent.jar. Si prega di sollevare un problema con Spring Jira a https: // jira.springframework.org/browse/SPR. Credo che il problema potrebbe essere che la classe servlet - non un'istanza del servlet, ma la classe stessa - viene caricata prima che venga chiamato spring ContextLoaderListener, quindi il framework spring non ha la possibilità di strumentare la classe servlet prima che sia caricato.

La strumentazione a molla per la tessitura a tempo di caricamento sembra essere basata sulla trasformazione del codice byte della classe prima che venga caricata. Se il contenitore della servlet sta trattenendo un'istanza dell'oggetto Class che è stata ottenuta prima che venisse trasformata dalla molla, allora (il contenitore servlet) non sarebbe in grado di produrre istanze della classe trasformata, né sarebbe in grado di eseguire istanze dello strumento creato usando i metodi factory su quell'oggetto Class.

+0

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

6

Questo è probabile perché il servlet viene istanziato e inizializzato dal contenitore servlet, prima del il contesto Spring viene inizializzato, ed è il contesto Spring che gestisce la tessitura del tempo di caricamento.

La tua roba <context:load-time-weaver/> è gestita all'interno del contesto di primavera servlet/o a livello di webapp? Il primo quasi certamente non funzionerà (per i motivi specificati sopra), ma potrebbe funzionare una configurazione a livello di webapp (usando ContextLoaderListener).

+0

Sto usando contextLoaderLister in web.xml ... e sembra che alcuni bean, che sono stati iniettati con successo, vengano creati prima del servlet ... – malejpavouk

+0

il contesto: il tag load-time-weaver si trova nel file di configurazione di primavera .. .Non so se è importante, ma sto usando l'agente di primavera per strumentare il mio codice – malejpavouk

Problemi correlati