2014-05-13 4 views
-2

Je travaille sur une application web Spring Hibernate et Spring Mvc, Et je me demande pourquoi Autowiring fonctionne seulement à l'intérieur du contrôleur ceci est un exemple simple:Pourquoi l'autowiring ne fonctionne pas?

@Controller 
@RequestMapping(value="SW/excel") 
public class ExcelController 
{ 
    @Autowired 
    private BlablaService blablaService; 
    @RequestMapping({""}) 
    public ModelAndView indexPage() 
    { 
    List<Blabla> blablas=BlablaService.getAllBlablas(); 
    } 
} 

Ce code fonctionne bien pour moi, il renvoie la liste de Blablas J'ai dans ma base de données. mais quand je travaille avec mon BlablaService en dehors du contrôleur, il ne fonctionne pas et est ici et exemple

@Controller 
@RequestMapping(value="SW/excel") 
public class ExcelController 
{ 
    @RequestMapping({""}) 
    public ModelAndView indexPage() 
    { 
    BlablaLister lister= new ExcelExporter(); 
    List<Blabla> blablas=lister.getList(); 
    } 

} 

Et voici Excel Exportateur:

Class BlablaLister { 
@Autowired BlablaService blablaService; 
public List<Blabla> getList() 
    { 
     return blablaService.getAllBlablas; 
    } 
} 

Mais je reçois toujours, NullPointerException , le getAllBlablas renvoie Null chaque fois qu'il est utilisé dans une classe en dehors du contrôleur.

+3

Ne devrait-il pas s'agir de @Controller ou d'une version française de Spring @Controlleur? ;) – Stefan

+0

Erreur de saisie ... – TheByeByeMan

Répondre

5

Votre BlablaLister être initiée par le printemps afin Autowiring travailler

+0

pourquoi le service autowired fonctionne dans le contrôleur, en supposant que je n'ai pas de configuration pour lancer le contrôleur via le printemps? – TheByeByeMan

+0

En fait, en le marquant un @Controller et en utilisant l'analyse des composants dans votre ressort de configuration printanier le ramassera automatiquement – maczikasz

+0

selon la documentation de Spring si j'ajoute @Component à ma classe, il sera automatiquement choisi comme Aidan suggéré, mais je J'ai le même problème ... – TheByeByeMan

2

Pour que le autowiring au travail du printemps doit savoir sur l'objet - soit en l'ayant instancié dans le fichier de configuration ou en utilisant l'un des les annotations qui instancient un bean. Pour le faire fonctionner, il vous suffit probablement d'ajouter l'annotation @Component pour l'identifier comme un bean géré par le printemps.

@Component 
Class BlablaLister { 
@Autowired BlablaService blablaService; 
public List<Blabla> getList() 
    { 
     return blablaService.getAllBlablas; 
    } 
} 
+0

Renvoie toujours null ... – TheByeByeMan

+0

Comment instanciez-vous votre BlablaLister? Est-ce que vous le demandez dans le contexte du printemps ou créez-vous simplement une instance? Vous devez demander l'instance dans le contexte du printemps. – Aidan

+0

Merci @Aidan :) Je comprends maintenant – TheByeByeMan