2010-09-27 2 views
0

J'ai lu à peu près @Resource annotation de cet article (http://www.infoq.com/articles/spring-2.5-part-1) et souhaite l'utiliser sur Tomcat 6.0.26 et 3.0.3 SpringDataSource pas injecté à @Resource champ annotée avec alwaysUseJndiLookup mise

Mais il ne pas de travail - le champ ds dans Users classe n'est pas initialisé et j'ai NullPointerException lorsque j'essaie de faire une requête.

Fichier src/org/example/db/Users.java

package org.example.db; 
import javax.sql.DataSource; 
import javax.annotation.Resource; 

@Repository 
public class Users { 

@Resource private DataSource ds; 
... 
} 

Fichier WEB-INF/spring-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:jee="http://www.springframework.org/schema/jee" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/jee 
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<context:component-scan base-package="org.example.web.controller,org.example.db" /> 

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

<jee:jndi-lookup id="ds" jndi-name="java:comp/env/jdbc/mydb" /> 

</beans> 

Fichier WEB-INF/web.xml

<resource-ref> 
    <description>DB Connection</description> 
    <res-ref-name>jdbc/mydb</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

dans le fichier journal:

DEBUG 2010-09-27 21:56:00,085: Creating shared instance of singleton bean 'ds' 
DEBUG 2010-09-27 21:56:00,085: Creating instance of bean 'ds' 
DEBUG 2010-09-27 21:56:00,086: Eagerly caching bean 'ds' to allow for resolving potential circular references 
DEBUG 2010-09-27 21:56:00,106: Invoking afterPropertiesSet() on bean with name 'ds' 
DEBUG 2010-09-27 21:56:00,116: Finished creating instance of bean 'ds' 
DEBUG 2010-09-27 21:56:00,149: Found injected element on class [org.example.db.Users]: ResourceElement for private javax.sql.DataSource org.example.db.Users.ds 
DEBUG 2010-09-27 21:56:00,152: Found injected element on class [org.example.db.Users]: ResourceElement for private javax.sql.DataSource org.example.db.Users.ds 
DEBUG 2010-09-27 21:56:00,161: Processing injected method of bean 'users': ResourceElement for private javax.sql.DataSource org.example.db.Users.ds 
DEBUG 2010-09-27 21:56:00,163: Returning cached instance of singleton bean 'ds' 
DEBUG 2010-09-27 21:56:00,442: Returning cached instance of singleton bean 'ds' 
DEBUG 2010-09-27 21:56:00,593: Rejected bean name 'ds': no URL paths identified 
DEBUG 2010-09-27 21:56:00,738: Rejected bean name 'ds': no URL paths identified 

Je ne sais pas pourquoi cela ne fonctionne pas. J'ai trouvé dans ce documentation:

REMARQUE: Un défaut CommonAnnotationBeanPostProcessor sera enregistré par les balises XML « contexte:: annotation-config » et « composants d'analyse du contexte ». Supprimez ou désactivez la configuration d'annotation par défaut si vous avez l'intention de spécifier une définition de bean CommonAnnotationBeanPostProcessor personnalisée!

Je pense qu'il peut s'agir de mon problème, mais dans ce cas, je ne sais pas comment "Supprimer ou désactiver la configuration d'annotation par défaut".

Aidez-nous s'il vous plaît. Merci d'avance!

+0

Je ne suis pas sûr que cela résoudra votre problème, pouvez-vous essayer de changer 'ds' à quelque chose d'autre, quelquefois plus de 2 caractères? –

+0

@Jaydeep: merci. Non, rien n'a changé après avoir renommé la variable de ds à dataSource partout. –

Répondre

0

Pour l'instant, ce problème est résolu.

Tout ce code fonctionne, mais je pense que le problème était dans certaines des classes liées. Par exemple, j'ai la hiérarchie autowiring suivante: dataSource injecte dans la classe Users, la classe Users injecte dans Validator, Validator est appelé depuis Controller. Dans cette chaîne étaient quelques bugs:

  • Les utilisateurs sont créés à l'aide d'une nouvelle instance de validateur
  • après propagation @Autowiring, l'utilisateur ne s'injectaient pas à Validator parce que cette classe était dans un autre paquet et composants scan ne trouvent
  • utilisateur plus tard n'a pas à injecter Validator parce que cette classe n'a pas d'annotation @component
  • Controller crée une nouvelle instance de validateur en utilisant le constructeur par défaut

A Après avoir résolu tous ces problèmes, tout fonctionne bien.

Questions connexes