2010-08-10 8 views
11

J'ai un tas de java étiquettes personnalisées qui utilisent des haricots gérés par ressort .. puisque je ne peux pas trouver un moyen d'injecter dans un tag personnalisé, je créé une classe d'aide qui fournit des méthodes statiques à "getTheObjectINeedBean()" pour tous les objets de haricots de printemps dont j'ai besoin .. Je n'aime pas du tout cette approche.Y at-il une manière élégante d'injecter un haricot géré par ressort dans un tag java personnalisé/simple

je veux vraiment être en mesure d'injecter un ressort dans le bean géré balise personnalisée

Est-il possible? En ce qui concerne mes recherches va, je comprends qu'il n'y a pas moyen de le faire, parce que la balise personnalisée est gérée par conteneur

Merci,

Billy

+0

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

Répondre

7

Vous avez raison il n'y a pas un moyen simple de utilisez l'injection de dépendance dans les balises jstl, car elles ne sont pas gérées au printemps et ne peuvent pas l'être. Cependant, il y a (au moins) deux solutions de contournement:

  • @Configurable - AspectJ vous permet de brancher un tisserand à la charge en temps/la compilation, de sorte que même des objets qui ne sont pas instanciés au printemps peuvent être au courant du printemps. Voir here

  • Vous pouvez créer une classe de balise de base pour votre projet et appeler une méthode init(..) à partir de chaque méthode doStartTag(..). Là, vous pouvez obtenir le ServletContext à partir du pageContext, et ainsi obtenir le ressort ApplicationContext (via ApplicationContextUtils). Puis:

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

Ni les options sont parfaits car ils nécessitent soit un code supplémentaire, ou une « magie noire »

7

développiez @ poste de Bozho, j'ai obtenu cela fonctionne comme ceci: (au printemps 3.0 il n'y a pas ApplicationContextUtils que je pouvais trouver)

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

Merci "getRequestContext(). GetWebApplicationContext()" résolu mon problème – TrueCoke

0

La solution comme décrit ci-dessus fonctionne, mais quelques informations et extraits de code supplémentaires sont, très probablement, utile.

1) La méthode doStartTagInternal est appelée à partir de la méthode doStartTag. 2) J'ai été forcé de mettre en premier le pageContext avant d'appeler le doStartTag 3) J'ai fait une recherche du bean par opposition à l'autowiring. Pour moi, cela semble plus simple: (YourBeanProxy) autowireCapableBeanFactory.getBean ("yourBeanName")

Espérons que cette information supplémentaire est utile.