Spring Boot-Annotation @Autowired von Service schlägt fehl
Ich versuche zu verwenden @Autowired
annotation für eine Service-Klasse in Spring-Boot-Anwendung, aber es hält werfen No qualifying bean of type
Ausnahme. Jedoch, wenn ich den service Klasse, um eine Bohne, dann funktioniert es einwandfrei. Das ist mein code:
package com.mypkg.domain;
@Service
public class GlobalPropertiesLoader {
@Autowired
private SampleService sampleService;
}
package com.mypkg.service;
@Service
public class SampleService{
}
Und das ist mein SpringBoot Klasse:
package com.mypkg;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
@SpringBootApplication
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableTransactionManagement
public class TrackingService {
private static final Logger LOGGER = LoggerFactory.getLogger(TrackingService.class);
static AnnotationConfigApplicationContext context;
public static void main(String[] args) throws Exception {
SpringApplication.run(TrackingService.class, args);
context = new AnnotationConfigApplicationContext();
context.refresh();
context.close();
}
}
Wenn ich versuche zu laufen, bekomme ich die folgende exception:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.mypkg.service.SampleService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Aber wenn ich entfernen Sie die @Service
Anmerkung aus der SampleService-Klasse, und fügen Sie es als eine Bohne in meiner AppConfig Klasse als unten, es funktioniert:
@Configuration
public class AppServiceConfig {
public AppServiceConfig() {
}
@Bean(name="sampleService")
public SampleService sampleService(){
return new SampleService();
}
}
Sind die Klassen in verschiedene Pakete. Ich bin nicht mit @ComponentScan
. Stattdessen bin ich mit @SpringBootApplication
die macht das automatisch. Jedoch habe ich versucht, mit ComponentScan als gut, aber das hat nicht geholfen.
Was mache ich hier falsch?
- Können Sie zeigen Sie Ihre
Application
- Klasse (die mit demmain
- Methode)? - Ich aktualisiert meine Frage mit dem code für die main-Klasse.
- Warum schließen Sie den Kontext? Sie wissen, es wird alles zerstören, die Bohnen Ritus.
- Ich konnte nicht reproduzieren, dieses Problem auf den ersten, mit ziemlich den gleichen code, den Sie geschrieben. Dann irgendwann merkte ich, wenn ich fügte hinzu, die
@Service
Anmerkung und drücken Sie die quick-import, habe ich zwei Möglichkeiten. So gab es eine zweite@Service
aus einer Abhängigkeit hatte ich in meinem pom, in diesem Fallspring-boot-starter-jersey
aber es könnte andere geben. Es klingt wie eine lange gedreht, aber könnten Sie genauer zu überprüfen import für Ihre@Service
? - Ich habe eingegeben in einem ähnlichen Beispiel und es funktioniert alles perfekt. Wie oben erwähnt können Sie in der voll-qualifizierte package-name der @Service-annotation sind Sie importiert ?
- Sie sollten akzeptieren, @EdduMelendez die Antwort, wie löst Ihr Problem und erklärt im detail, warum sollten Sie es tun die Art, wie er vorgeschlagen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie zwei Möglichkeiten, um ein Spring-bean. Sie brauchen nur einen davon benutzen.
@Service über die POJO -
@Bean in der configuration-Klasse, die muss annotiert mit @Configuration
@Autowired ist gelöst durch die Klasse geben Sie dann
@Bean(name="sampleService")
ist nicht erforderlich, ist Sie nur eine bean mit dieser Klasse geben.EDIT 01
Paket com.Beispiel
Paket com.Beispiel.config
Paket com.Beispiel.repository
Paket com.Beispiel.service
Mit diesem code können Sie den Kommentar der AppConfig Klasse und dann werden Sie se, wie UserRepository und UserService sind autowired. Nach diesem Kommentar @ - Service in jeder Klasse, und kommentieren Sie AppConfig und Klassen werden autowired zu.
@Service
über die POJO, schlägt fehl. Aber wenn ich@Bean
in meiner Konfiguration sind Klasse, es funktioniert. Ich will wissen, warum die@Service
Weise versagt.@Service
Methode nicht funktioniert. Es ist nur Holen, wenn es erklärt wird, wie ein@Bean
.