2012-03-29 17 views
7

Tengo problemas con un campo anotado como @Resource en un Spring Bean. Lo que tengo:Spring @Resource Handling

un campo, con método de selección, anotado @Resource

@Resource 
private URL someUrl; 

public void setSomeUrl(URL someUrl) { 
    this.someUrl = someUrl; 
} 

Un <env-entry> etiqueta en mi descriptor de despliegue (web.xml)

<env-entry> 
    <env-entry-name>someUrl</env-entry-name> 
    <env-entry-type>java.net.URL</env-entry-type> 
    <env-entry-value>http://somedomain.net/some/path</env-entry-value> 
</env-entry> 

La aplicación no puede iniciar con una BeanCreationException, lo que no espero porque no necesariamente quiero que la primavera inyecte un grano administrado por Spring. Quiero que Spring procese @Resource y recupere el recurso JNDI.

Esto es Spring 2.5.6SEC03 y el bean en sí tiene la anotación @Service para el autoenlace en otras instancias @Component. El contenedor del servlet en este caso es Tomcat 7, pero finalmente se implementará en Weblogic 10, por lo que si bien me gustaría que una solución funcione en ambos, Weblogic es imprescindible.

¿Estoy haciendo un uso indebido de esta función en Spring 2.5? ¿En general? ¿Hay algo que me falta? Algo que malinterpreto sobre JNDI? Toda la ayuda es apreciada. Gracias.

Respuesta

7

Si está utilizando las anotaciones de Spring Stereotype, (@Service, @Component ...), entonces probablemente esté incluyendo en su configuración de primavera el elemento <context:component-scan /> para recogerlas. Está bien hacerlo, pero registrará automáticamente un CommonAnnotationBeanPostProcessor con el contexto de la aplicación, as stated just above the second note in this link.

El problema con la inclusión de CommonAnnotationBeanPostProcessor es que Spring maneja la anotación @Resource e intentará inyectar beans desde su contexto de aplicación. Puede registrar su propio bean CommonAnnotationBeanPostProcessor y decirle a Spring que permita el acceso directo de JNDI a estos @Resource al configurar el bean configurando la propiedad alwaysUseJndiLookup en true.

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"> 
    <property name="alwaysUseJndiLookup" value="true"/> 
</bean> 

Prestar atención a la nota en la documentación vinculada:

NOTA: Un defecto CommonAnnotationBeanPostProcessor será registrado por el "contexto: anotación-config" y "contexto: componente de escaneado" etiquetas XML . ¡Elimine o desactive la configuración de anotación predeterminada si tiene la intención de especificar una definición de bean CommonAnnotationBeanPostProcessor personalizada!

+0

Genial, ¡esto funcionó por completo! También descubrí que puede obligar a CommonAnnotationBeanPostProcessor a realizar una búsqueda JNDI al sprcificar un valor para "mappedName" en el cuerpo de la anotación. Dicho todo esto, y después del trabajo puesto en esto, aprendí que nuestro proceso estándar de implementación corporativa no admitirá descriptores de implementación múltiples. Se supone que debo usar el mismo en todas las implementaciones. Entonces, este enfoque no funcionará. –