2011-01-16 18 views
6

Quiero usar spring-beans en mis taglibs personalizados en una aplicación spring-mvc. Causa TagLib-Instances no se instancian para la primavera, no puedo usar dependennecy-injection.Spring MVC y etiquetas personalizadas

Mi siguiente idea fue agregar el contexto de primavera por un interceptor a la solicitud y obtenerlo de la solicitud dentro de la clase de etiqueta.

¿Hay una mejor manera de utilizar la primavera en taglibs? ¿Hay algo listo para usar en la primavera? Si aún no hay soporte para etiquetas personalizadas en spring-mvc, ¿hay alguna manera de poblar un objeto existente con dependencias?

public class MyTag extends TagSupport { 
    @Autowired 
    private MyObject object; 

    public void setMyObject(MyObject myObject) { 
    this.myObject = myObject; 
    } 

    public int doEndTag() { 
    ApplicationContext context = request.getAttribute("context"); 
    context.populate(this); 

    return object.doStuff(); 
    } 
} 
+0

posible duplicado de [Cómo inyectar granos de primavera en un JSP 2.0 SimpleTag?] (Http://stackoverflow.com/questions/1296052/how-to-inject-spring-beans-into- a-jsp-2-0-simpletag) – skaffman

+0

Sé que probablemente no quiera escuchar esto, pero ¿por qué está realizando operaciones que requieren granos de primavera en su vista? Lo mejor es mantener sus puntos de vista lo más simple posible. Intentaré hacer esto en tu controlador si aún no lo has hecho ... – Caps

+0

Estoy de acuerdo con @Caps. Deberías mover ese código al controlador. –

Respuesta

3

Por último la forma de trabajo para hacer esto fue declarar los campos que deben iniciarse en la primavera como estáticos y permiten iniciar una instancia de etiqueta

public class MyTag extends TagSupport { 
    private static MyObject myObject; 

    @Autowired 
    public void setMyObject(MyObject myObject) { 
    MyTag.myObject = myObject; 
    } 

    public int doEndTag() { 
    return object.doStuff(); 
    } 

}

2

Debería preferir poner esa lógica en su controlador. Si realmente necesita hacer eso, puede escribir una clase de utilidad para recuperar los beans del contexto de la aplicación.

public class AppContextUtil implements ApplicationContextAware 
{ 
    private static final AppContextUtil instance = new AppContextUtil(); 
    private ApplicationContext applicationContext; 

    private AppContextUtil() {} 

    public static AppContextUtil getInstance() 
    { 
     return instance; 
    } 

    public <T> T getBean(Class<T> clazz) 
    { 
     return applicationContext.getBean(clazz); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException 
    { 
     this.applicationContext = applicationContext; 
    } 
} 

A continuación, sería capaz de recuperar su grano de la siguiente manera:

AppContextUtil.getInstance().getBean(MyObject.class);