2010-08-10 11 views
11

Tengo un montón de etiquetas personalizadas de Java que usan frijoles administrados por resorte ... ya que no puedo encontrar una manera de inyectar en una etiqueta personalizada, Creé una clase de ayuda que proporciona métodos estáticos a "getTheObjectINeedBean()" para todos los objetos de bean de primavera que necesito. No me gusta este enfoque en absoluto.hay una forma elegante de inyectar un frijol administrado por resorte en una etiqueta personalizada/simple de Java

que realmente quieren ser capaces de inyectar un resorte bean gestionado en la etiqueta personalizada

¿Hay alguna manera? En lo que a mi investigación va, entiendo que no hay manera de hacer esto, ya que la etiqueta personalizada es gestionado por contenedores

Gracias,

Billy

+0

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

Respuesta

7

Tiene razón en que no hay una forma sencilla de use la inyección de dependencia en las etiquetas jstl, porque no están administradas por la primavera, y no pueden ser. Sin embargo, hay (al menos) dos soluciones:

  • @Configurable - aspectj le permite conectar un tejedor en el tiempo de carga/tiempo de compilación, por lo que incluso los objetos que no se crean instancias para la primavera puede ser la primavera conscientes. Consulte here

  • Puede crear una clase de etiqueta base para su proyecto y llamar a un método init(..) desde cada método doStartTag(..). Allí, puede obtener el ServletContext del pageContext, y así obtener el resorte ApplicationContext (a través de ApplicationContextUtils). Entonces:

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

Ni las opciones son perfectos, ya que requieren ya sea un código adicional, o un poco de "magia negro"

7

Para ampliar @ post de Bozho, que han conseguido que esto funcione de esta manera: (en la primavera de 3,0 no hay ApplicationContextUtils que pude encontrar)

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

Gracias "getRequestContext(). GetWebApplicationContext()" resuelto mi problema – TrueCoke

0

la solución como se ha descrito anteriormente, pero algunos fragmentos de obras de antecedentes y de código adicional son, muy probablemente, útil.

1) El método doStartTagInternal se invoca desde el método doStartTag. 2) Me vi obligado a establecer el pageContext primero antes de invocar el doStartTag 3) Hice una búsqueda del bean en lugar del autoenvío. Para mí, esto parece más sencillo: (YourBeanProxy) autowireCapableBeanFactory.getBean ("yourBeanName")

Esperemos que esta información adicional sea útil.

Cuestiones relacionadas