Ich habe ein Problem, ein @Service
, ArchiveService
in einer Bibliothek zu installieren versuchen, gefunden @Service verdrahtet korrekt mit Spring Data JPA, keine qualifizierten Bean zu erhalten, nennen wir es App1
, die durch meine zweite Anwendung verwendet wird, App2
.kann nicht für die Abhängigkeit
ich in der Lage gewesen, um erfolgreich Setup @Repository
s von App1
die über @Autowired
in App2
ohne Probleme verwendet werden.
Jetzt Setup ArchiveService
ein @Service
Ich versuche, das @Repositories
mehr @Autowired
Archiv habe.
Das Problem tritt auf, wenn ich versuche, die ArchiveService
Form innerhalb der HomeController
von App2
ich in eine ungerade
Error creating bean with name 'homeController': Unsatisfied dependency expressed through field 'archiveService': No qualifying bean of type [com.miw.mcb.server.service.ArchiveService] found for dependency [com.miw.mcb.server.service.ArchiveService]: expected at least 1 bean which qualifies as autowire candidate for this dependency.
Dies scheint leite zu verweisen, dass es
No qualifying bean of type [app1.server.service.ArchiveService] found for dependency [app1.server.service.ArchiveService]
Frage
sagtWas ist falsch mit meiner Einrichtung der @Service
, ArchiveService
, für HomeController
, die kein Problem hat, die @Repository
's für die verschiedenen von HomeController
verwendeten Repositories zu finden.
UPDATE
hinzugefügt I die Komponente Scan des Servicepakets zu App2.
@ComponentScan(basePackages = "com.miw.mcb.server.service.archived")
Ich werde etwas zu lesen, um zu sehen, um zu tun, wenn dies zu tun, was ich beabsichtige zu tun. Gibt es eine andere Möglichkeit, die @Service
zu laden? Ich weiß, dass die Verwendung von @EnableJpaRepositories für die Repositories funktioniert.
Danke
Hier eine Aufschlüsselung der Klassen und Federkonfiguration ist.
APPLICATION 1-Klassen, die für App2 Teil einer abhängigen Bibliothek sind
TestRunRepository
@Repository
@Transactional
public interface TestRunRepository extends PagingAndSortingRepository<TestRun, Long> {
}
ArchivedTestRunRepository
@Repository
@Transactional
public interface ArchivedTestRunRepository extends CrudRepository<ArchivedTestRun, Long> {
}
.... (all of the archive repositories are the same)
A rchiveService
@Service
public class ArchiveService {
// setup Archive repositories
@Autowired
private ArchivedTestRunRepository archivedTestRunRepository;
@Autowired
private ArchivedTestSuiteRepository archivedTestSuiteRepository;
APPLICATION 2
Homecontroller
@RestController
public class HomeController {
@Autowired
private TestRunRepository testRunRepository;
@Autowired
private ArchiveService archiveService;
.......
}
AppConfig für App2
@Configuration
@EntityScan({"xxx.app1.model", "xxx.app1.model.archived"})
@EnableJpaRepositories({ "xxx.app1.dao.repository", "xxx.app1.dao.repository.archived", "xxx.app1.service" })
@SpringBootApplication
public class App2 {
...
}
Nebenbei bin ich mir nicht sicher, ob ich tatsächlich sowohl "xxx.app1.dao.repository", "xxx.app1.dao.repository.archived" für @EnableJpaRepositories
auflisten muss, als auch wenn ich das übergeordnete package
definiere ziehen Sie die subpackage
.
Stacktrace
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'homeController': Unsatisfied dependency expressed through field 'archiveService': No qualifying bean of type [app1.server.service.ArchiveService] found for dependency [app1.server.service.ArchiveService]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [app1.server.service.ArchiveService] found for dependency [app1.server.service.ArchiveService]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:569)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:349)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174)
at app2.adbservice.Main.main(Main.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:58)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [app1.server.service.ArchiveService] found for dependency [app1.server.service.ArchiveService]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1406)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1057)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566)
... 27 common frames omitted
Wie hängen die beiden Anwendungen zusammen? Warum gibt es überhaupt zwei Anwendungen? – Andreas
@Andreas Die zweite Anwendung ist eine Rest-basierte Anwendung. Die Anwendungen befinden sich auf verschiedenen Servern, kommunizieren jedoch mit derselben Datenbank. Die erste Anwendung definiert das Modell, die Repositories usw. – ALM
Wenn also die Klasse 'ArchiveService' in Anwendung 1 auf Server 1 sitzt, wie haben Sie dann erwartet, dass Spring sie der Klasse' HomeController' in Anwendung 2 auf Server 2 zuweist? Sie sind nicht in der gleichen JVM. Sie sind nicht einmal auf dem gleichen Server !!! Denk darüber nach. Wie kann eine Objektreferenz * physisch * geteilt werden, wenn sie sich nicht in derselben JVM befindet? Antwort: Es kann nicht. – Andreas