2016-11-03 5 views
-1

Ich arbeite derzeit mit Spring Boot, Erstellen eines CommandLineRunner. Alles funktionierte gut, bis ich versuchte @Autowired meine Klassen: Sie sind immer Null und haben den gleichen Fehler von Spring: "Fehler beim Erstellen Bean mit dem Namen 'initBatch': Injektion von autowired Abhängigkeiten gescheitert: Keine qualifizierende Bean vom Typ [Utils] gefunden für Abhängigkeit: mindestens 1 Bohne, die für diese Abhängigkeit als autowire Kandidat qualifiziert erwartet Abhängigkeit Anmerkungen ich kann immer noch nicht herausfinden, warum geschieht dieser Fehler Dies ist mein Code:...Spring Boot Service ist null

@SpringBootApplication 
public class InitBatch implements CommandLineRunner { 

@Autowired 
private Utils Utils; 

@Override 
public void run(String... args) throws Exception { 
    System.out.println("Hello World");   
} 

public static void main(String[] args) throws Exception { 
    SpringApplication.run(InitBatch.class, args); 
} 


@Bean 
public ReloadableResourceBundleMessageSource messageSource() { 
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 

     messageSource.setBasename("instances"); 
    return messageSource; 
} 

Dies ist die Utils-Klasse das verursacht problem:

@Configurable 
@Service 
public class Utils { 

private static final Logger LOG = LoggerFactory.getLogger(Utils.class); 

    //NUMEROUS METHODS... 
} 

Auch ich habe anot ihr Init, der die App als WS lädt. Alles läuft auf einem Server, die gleichen Klassen funktionieren großartig. Das ist die andere Init, das funktioniert:

@Configuration 
@ComponentScan({ "ws.controller","ws.service", 
"ws.dao", "ws.util", "ws.filtro", 
"ws.repository", "ws.model.log", "ws.logger.impl"}) 
@EnableAutoConfiguration 
public class Init extends SpringBootServletInitializer { 

private static final int SECS = 10; 

@Override 
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
    return application.sources(Init.class); 
} 

/** 
* Main method. 
* 
* @param args String[]. 
* @throws Exception Exception. 
*/ 
public static void main(String[] args) throws Exception { 
    SpringApplication.run(Init.class, args); 
} 


@Bean 
public ReloadableResourceBundleMessageSource messageSource() { 
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 

    messageSource.setBasename("instances"); 
    messageSource.setCacheSeconds(SECS); 
    return messageSource; 
} 
} 

Ich verstehe einfach nicht, warum die gleichen Dateien verwenden, mit der gleichen Konfiguration arbeitet mit Init.java (als tomcat web app), aber alle die gleiche Dateien sind null mit dem CommandLineRunner.

Irgendwelche Vorschläge?

Danke!

Antwort

1

Sie müssen ComponentScan Annotation mit Paket bei InitBatch (als Utils Klasse in verschiedenen Paket) zum Scannen von Beans zur Laufzeit angeben.

@Configuration 
@ComponentScan("ws.util") 
@EnableAutoConfiguration 
public class InitBatch implements CommandLineRunner { 
... 
} 

@SpringBootApplication Dokumentation -

Viele Frühlings-Boot-Entwickler immer ihre Hauptklasse kommentierte haben mit @Configuration, @EnableAutoConfiguration und @ComponentScan. Da diese Annotationen häufig zusammen verwendet werden (insbesondere wenn den oben beschriebenen Best Practices entspricht), bietet Spring Boot eine bequeme @SpringBootApplication-Alternative.

+0

Sie haben Recht, ich habe meinen vorherigen Test mit dieser Konfiguration vermasselt. Wenn ich den @ComponentScan funktioniert wie ein Charme. Vielen Dank! –

+0

Cheers ..... @ NicolasGallegos –

Verwandte Themen