@Autowire à défaut avec @Référentiel
Je suis de ne pas être en mesure de faire @Autowire annotation de travail avec un @Référentiel annoté de la classe.
J'ai une interface:
public interface AccountRepository {
public Account findByUsername(String username);
public Account findById(long id);
public Account save(Account account);
}
Et la classe implémentant l'interface annotée avec @Référentiel:
@Repository
public class AccountRepositoryImpl implements AccountRepository {
public Account findByUsername(String username){
//Implementing code
}
public Account findById(long id){
//Implementing code
}
public Account save(Account account){
//Implementing code
}
}
Dans une autre classe, j'ai besoin d'utiliser ce référentiel pour trouver un compte par le nom d'utilisateur, donc je suis à l'aide permettra à l'autowiring, mais je vérifie si ça marche et que les accountRepository instance est toujours null:
@Component
public class FooClass {
@Autowired
private AccountRepository accountRepository;
...
public barMethod(){
logger.debug(accountRepository == null ? "accountRepository is NULL" : "accountRepository IS NOT NULL");
}
}
J'ai aussi mis le paquets pour analyser les composants (sessionFactory.setPackagesToScan(new String [] {"com.foo.bar"});
), et il n'autowire autres classes annotées avec @Composant par exemple, mais dans ce seul annotée avec @Référentiel, il est toujours null.
Suis-je raté quelque chose?
FooClass
? Vous dites FooClass foo = new FooClass();
?Vous avez trouvé le problème, j'ai été faire un renvoi à un
new
au lieu de permettra à l'autowiring de trop. Poster une réponse si vous voulez l'accepter comme la bonne. Merci bien!double possible de Pourquoi est mon de Printemps @Autocâblés champ null?
OriginalL'auteur r.rodriguez | 2013-11-08
Vous devez vous connecter pour publier un commentaire.
Votre problème est probablement que vous êtes à l'instanciation de la fève de vous-même avec
new
, de sorte que le Printemps n'est pas au courant de ça. Injecter de la fève à la place, ou de faire le haricot@Configurable
et l'utilisation AspectJ.OriginalL'auteur chrylis
Il semble probable que vous n'avez pas configuré votre Printemps des annotations pour être activé. Je recommande de prendre un coup d'oeil à votre composant la numérisation des annotations. Par exemple en Java config de l'application:
... ou de configuration XML:
Si votre FooClass n'est pas sous la base-packages définis dans cette configuration, puis l' @Autocâblés sera ignoré.
Comme un point supplémentaire, je vous recommande d'essayer @Autocâblés(required = true) - que devrait provoquer une défaillance de votre application sur les start-up plutôt que d'attendre jusqu'à ce que vous utilisez le service pour lancer une NullPointerException. Toutefois, si les annotations ne sont pas configurés, alors il n'y aura pas d'échec.
Vous devriez vérifier que votre permettra à l'autowiring est effectué correctement, à l'aide d'un test JUnit.
Cela devrait indiquer si votre configuration est correcte. L'étape suivante, en supposant qu'il est en train d'être déployé comme une application web, serait de vérifier que vous avez mis le bon de pièces et de morceaux dans votre web.xml et foo-servlet.xml configurations pour déclencher le Printemps de l'initialisation.
@ComponentScan(basePackages = { "com.foo" })
et ma classe est en vertu de ce package. J'ai aussi essayé d'ajouter<context:annotation-config />
mais il ne fonctionne pas.OriginalL'auteur Steve
FooClass doit être instanciés par le Printemps pour avoir son depencies géré.
Assurez-vous que FooClass est instanciés comme un haricot (@Composant ou de l'annotation @Service, ou de la déclaration XML).
Edit :
sessionFactory.setPackagesToScan
est à la recherche de JPA/Hibernate annotations alors que@Repository
est un Printemps Contexte de l'annotation.AccountRepositoryImpl
doit être au Printempscomponent-scan
portéeCe qui concerne,
Jetez un oeil à mon propre édition, il peut aider 🙂
Mais @Composant est également un Printemps Contexte de l'annotation et il fonctionne très bien avec d'autres classes annotées avec le Composant.
Mais dans quel paquet est
AccountRepositoryImpl
? Et qu'est-ce que le Printempscontext:component-scan
? Sont elles de correspondance ?FYI - Vous n'avez pas besoin d'annoter une classe de Composant (ou tout autre stéréotype) pour Autocâblés annotations à l'intérieur de travail. Tout n'est pas dans l'application doit être une source de haricot.
OriginalL'auteur FabienM