2010-08-10 15 views
11

Ho un sacco di tag personalizzati java che usano bean gestiti a molla .. poiché non riesco a trovare un modo per iniettare in un tag personalizzato, io ha creato una classe helper che fornisce metodi statici a "getTheObjectINeedBean()" per tutti gli oggetti spring bean di cui ho bisogno .. Non mi piace affatto questo approccio.c'è un modo elegante per iniettare un bean gestito in primavera in un tag java personalizzato/semplice

Ho molta voglia di essere in grado di iniettare una molla gestito fagiolo nel tag personalizzato

Esiste un modo? Per quanto riguarda la mia ricerca va, ho capito non v'è alcun modo per fare questo, perché il tag personalizzato è contenitore gestito

Grazie,

Billy

+0

Duplicato di http://stackoverflow.com/questions/1296052/how-to-inject-spring-beans-into-a-jsp-2-0-simpletag – skaffman

risposta

7

Lei ha ragione, non c'è un modo semplice per usa l'iniezione di dipendenza nei tag jstl, perché non sono gestiti dalla primavera e non possono essere. Tuttavia ci sono (almeno) due soluzioni:

  • @Configurable - AspectJ consente di collegare un tessitore al load-time/tempo di compilazione, in modo che anche gli oggetti che non vengono istanziati entro la primavera può essere primavera consapevoli. Vedi here

  • È possibile creare una classe tag di base per il progetto e chiamare un metodo init(..) da ogni metodo doStartTag(..). Lì, è possibile ottenere il ServletContext dal pageContext e quindi ottenere la molla ApplicationContext (tramite ApplicationContextUtils). Poi:

    AutowireCapableBeanFactory factory = appCtx.getAutowireCapableBeanFactory(); 
    factory.autowireBean(this); 
    

Né opzioni sono perfetti in quanto richiedono sia un po 'di codice aggiuntivo, o qualche "magia nera"

7

di espandere @ post di Bozho, ho ottenuto questo per funzionare in questo modo: (in primavera 3.0 non ci sono ApplicationContextUtils che ho potuto trovare)

public class LocationTag extends RequestContextAwareTag { 
    @Autowired 
    PathComponent path; 

... 
    @Override 
    protected int doStartTagInternal() throws Exception { 
     if (path == null) { 
      log.debug("Autowiring the bean"); 
      WebApplicationContext wac = getRequestContext().getWebApplicationContext(); 
      AutowireCapableBeanFactory acbf = wac.getAutowireCapableBeanFactory(); 
      acbf.autowireBean(this); 
     } 
     return SKIP_BODY; 
    } 
} 
+0

Grazie "getRequestContext(). GetWebApplicationContext()" risolto il mio problema – TrueCoke

0

la soluzione come indicato sopra funziona, ma alcuni retroscena e codice addizionale frammenti sono, molto probabilmente, utile.

1) Il metodo doStartTagInternal viene richiamato dal metodo doStartTag. 2) Sono stato costretto a impostare il pageContext prima di richiamare il doStartTag 3) Ho effettuato una ricerca del bean invece dell'autowiring. Per me questo sembra più semplice: (YourBeanProxy) autowireCapableBeanFactory.getBean ("yourBeanName")

Speriamo che queste informazioni aggiuntive siano utili.

Problemi correlati