2010-08-10 6 views
11

Ich habe eine Reihe von Java-benutzerdefinierten Tags, die im Frühjahr verwaltete Bohnen verwenden .. da ich einen Weg finden, in ein benutzerdefiniertes Tag zu injizieren, ich Ich habe eine Helper-Klasse erstellt, die "getTheObjectINeedBean()" für alle Spring Bean-Objekte, die ich brauche, mit statischen Methoden unterstützt. Ich mag diesen Ansatz überhaupt nicht.gibt es eine elegante Möglichkeit, eine Feder Managed Bean in ein Java-Custom/einfache Tag zu injizieren

Ich möchte in der Lage sein, um wirklich

Gibt es eine Möglichkeit, eine Feder Managed Bean in das benutzerdefinierte Tag zu spritzen? Soweit meine Forschung geht, verstehe ich, gibt es keine Möglichkeit, dies zu tun ist, weil der benutzerdefinierte Tag Container

Dank gelungen ist

Billy

+0

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

Antwort

7

Sie richtig sind, gibt es keine einfache Möglichkeit, Verwenden Sie Abhängigkeits-Injektion in JSTL-Tags, weil sie nicht von Frühjahr verwaltet werden, und kann nicht sein. Allerdings gibt es (mindestens) zwei Lösungen:

  • @Configurable - aspectj Sie einen Weber während der Ladezeit zu stopfen erlaubt/kompilieren-Zeit, so dass auch Objekte, die nicht durch die Feder instanziiert werden kann Frühling bewusst sein. Siehe here

  • Sie können eine Basis-Tag-Klasse für Ihr Projekt erstellen, und ruft eine init(..) Methode von jedem doStartTag(..) Verfahren. Dort erhalten Sie die ServletContext aus der pageContext, und erhalten so die Feder ApplicationContext (über ApplicationContextUtils). Dann:

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

weder Optionen sind perfekt, als sie benötigen, entweder einige zusätzliche Code, oder einige „schwarze Magie“

7

Um auf @ Bozho der Post zu erweitern, habe ich dies wie so arbeiten bekommen: (im Frühjahr 3.0 gibt es keine ApplicationContextUtils, die ich finden konnte)

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

Danke "getRequestContext(). GetWebApplicationContext()" gelöst mein Problem – TrueCoke

0

Die Lösung, wie oben beschrieben funktioniert, aber einig Hintergrund und zusätzlichen Code-Schnipsel sind, sehr wahrscheinlich, nützlich.

1) Die doStartTagInternal-Methode wird von der doStartTag-Methode aufgerufen. 2) Ich musste den pageContext zuerst setzen, bevor ich den doStartTag anrief 3) Ich habe einen Lookup der Bean im Gegensatz zum Autowinding gemacht. Für mich scheint das einfacher zu sein: (YourBeanProxy) autowireCapableBeanFactory.getBean ("yourBeanName")

Hoffentlich ist diese zusätzliche Information nützlich.

Verwandte Themen