2011-06-22 3 views
0

Je n'arrive pas à comprendre pourquoi autowiring ne fonctionne pas comme il se doit. J'ai une application non-web qui utilise le ressort 3 et ainsi dans la méthode principale de l'application que je me suis fixé pour créer le contexte d'application comme ceci:Comment faire fonctionner @Repository?

ApplicationContext ctx = new ClassPathXmlApplicationContext(
         DEFAULT_APP_CONTEXT); 

Et le fichier .xml a en tête la substance nécessaire pour autowiring pour travailler:

<context:annotation-config /> 
<context:component-scan base-package="star,hw" /> 

Cependant, cela ne fonctionne pas. J'ai une classe de service avec une annotation niveau de la classe @Repository sous package hw, mais en essayant de @Autowire j'obtenir:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'inventoryDAO' is defined 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:527) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1083) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:274) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322) 
    ... 77 more 

Une chose bizarre, j'ai remarqué dans le fichier journal:

Pre-instantiating singletons in org.s[email protected]4440ece0: defining beans [*skipping*, inventoryDAOImpl, *skipping*] 

Ce est la classe sur laquelle j'ai @Repository, mais elle implémente InventoryDAO. N'est-ce pas mal qu'il montre là inventoryDAOImpl? Que puis-je faire pour comprendre ce qui ne va pas? Editer: D'accord, probablement le problème n'est pas dans @Autowire mais dans @Repository pour ne pas faire le haricot correctement.

Répondre

1

Essayez @Repository("inventoryDAO").

+0

Ouch, cela a fait l'affaire! Pourquoi? : o J'ai une application web où j'utilise '@ Repository' sans avoir à écrire quoi que ce soit. – Rihards

+0

Si vous utilisez autowiring-by-name sous quelque forme que ce soit, le nom du bean est par défaut le nom de la classe (avec la première lettre downcased). Le nom du bean dans votre cas était donc inventoryDaoImpl. Avec autowiring-by-type, vous ne devriez pas avoir à spécifier un nom tant que votre DAO est le seul sur le contexte de l'application (ce qui est généralement le cas avec les DAO). –

+0

N'a pas @Autowire par type par défaut? Comment faire un autowire par type? J'ai juste ajouté '@ Autowire' pur au champ dans la classe de service pour autowire le DAO. – Rihards