2017-10-07 3 views
1

Ich bin jetzt ziemlich verwirrt, ich möchte @Autowired MongoClient Attribut in einer meiner Controller-Klassen verwenden, aber ohne Erfolg. Der schwierige Teil davon ist, dass @Autowired von meinem @RestController funktioniert.Spring Boot - Autowired MongoClient

@RestController 
public final class WebController { 

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

aber:

@Controller 
public final class MongoUsersDAO { 

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

hier bekomme ich null.

Ich glaube nicht, dass das Problem der Komponente Scan während mein @SpringBootApplication bei xyz, mein @RestController bei xyzt befindet sich wäre und meine @Controller bei xyzk Pakete sollten daher Stand von ihnen sein gescannt von Spring. (Die Eclipse markiert auch meine @Controller als eine Spring-Klasse)

Was könnte sonst noch das Problem sein?

Hinweis: Wenn ich dies zu meinem @Controller hinzufügen es funktioniert gut, aber die @Autowired noch wount Arbeit:

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

Hinweis: In der genannten MongoUsersDAO die autowired Sache überhaupt nicht funktioniert, ich Ich habe versucht, eine einfache Eigenschaft aus den application.properties zu erhalten, ohne Erfolg.

+0

seltsam. Irgendwelche Protokolle? Irgendwelche, wo Sie neue MongoUsersDAO() angerufen haben? . Seltsam, warum DAO-Klasse mit @Controller annotiert ist? – Barath

+0

Ich habe versucht, es mit Service, Komponente usw. zu kommentieren. Der neue mongoUsersDAO() wird innerhalb des WebControllers aufgerufen, wenn eine neue Anfrage kommt. (Es ist noch eine Test-Implementierung) –

+0

Das ist das Problem. Rufen Sie nicht neu mongoUserdDao() auf. Wenn Sie dies tun, wird das Autowiren nicht passieren. – Barath

Antwort

1

Ihr Problem ist aufgetreten, weil Sie new MongoUserDAO() innerhalb Ihrer WebController Klasse aufgerufen haben, wie Sie im Kommentar unter Ihre Frage erwähnt haben. Wenn Sie ein Objekt manuell instanziieren und das Feld mit @Autowired annotiert ist, wird dieses Feld nicht mit der erwarteten Instanz instanziiert.

Inject MongoUsersDAO direkt auf Ihre WebController Klasse wie unten dargestellt, Frühling wird Griff MongoClient-MongoUserDAO Klasse für Sie injiziert.

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

Danke nochmal :) –

Verwandte Themen