2017-10-07 2 views
1

Je suis assez confus maintenant, je voudrais utiliser l'attribut MongoClient @Autowired dans une de mes classes Controller, mais sans succès. La partie la plus délicate est que @Autowired fonctionne depuis mon @RestController.Spring Boot - Autowired MongoClient

@RestController 
public final class WebController { 

    /** mongoClient */ 
    @Autowired 
    private MongoClient mongoClient; <- here it's working ... 
... 
} 

mais:

@Controller 
public final class MongoUsersDAO { 

    /** mongoClient */ 
    @Autowired 
    private MongoClient mongoClient; <- not working ... 
... 
} 

ici je reçois nulle.

Je ne pense pas que le problème serait l'analyse composante alors que mon @SpringBootApplication est situé à xyz, mon @RestController à XYZT et mon @Controller à xyzk paquets, d'où le stand d'entre eux devraient être scanné par Spring. (L'Eclipse marque également mon @Controller comme une classe Spring)

Quoi d'autre pourrait alors être le problème?

Note: Si j'ajoute à mon @Controller il fonctionne très bien, mais le reste du travail @Autowired wount:

@PostConstruct 
    public void init() { 
    System.out.println("INIT"); 
    } 

Note: Dans le MongoUsersDAO mentionné la chose autowired ne fonctionne pas du tout, je J'ai essayé d'obtenir une propriété simple à partir du fichier application.properties, sans succès.

+0

étrange. Des journaux? où vous avez appelé new MongoUsersDAO()? . Curieusement pourquoi la classe DAO est annotée avec @Controller? – Barath

+0

J'ai aussi essayé de l'annoter avec un service, un composant, etc. Le nouveau mongoUsersDAO() est appelé à l'intérieur du WebController lorsqu'une nouvelle requête arrive. (c'est encore une implémentation de test) –

+0

C'est le problème. N'appelez pas new mongoUserdDao(). Si vous faites cela autowiring ne se produira pas. – Barath

Répondre

1

Votre problème est survenu parce que vous avez appelé new MongoUserDAO() à l'intérieur de votre classe WebController comme vous l'avez mentionné dans le commentaire ci-dessous votre question. Si vous instanciez un objet à la main et que vous avez annoté un champ avec @Autowired, ce champ ne sera pas instancié avec l'instance attendue.

Injecter MongoUsersDAO directement à votre classe WebController comme indiqué ci-dessous, Spring va gérer l'injection classe MongoClient-MongoUserDAO pour vous.

WebController:

@RestController 
public final class WebController { 

    /** Service/Repository class*/ 
    @Autowired 
    private MongoUsersDAO dao; 

    @GetMapping("/all") 
    public String getAll(){ 
     dao.callSomeMethod(); 
    } 
} 

MongoUsersDAO:

@Repository 
public final class MongoUsersDAO { 

    /** mongoClient */ 
    @Autowired 
    private MongoClient mongoClient; 
... 
} 
+0

Merci encore :) –