2016-09-20 1 views
-1

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

sagt

Was 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 
+0

Wie hängen die beiden Anwendungen zusammen? Warum gibt es überhaupt zwei Anwendungen? – Andreas

+0

@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

+0

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

Antwort

0

Können Sie bitte versuchen @SpringBootApplication Anmerkung in App2 mit @SpringBootApplication(scanBasePackages = {"app1.server.service"}) zu ersetzen. Ich denke, dass die Anwendung aufgrund der aktuellen Konfiguration nur Entity- und Repository-Beans scannt.

Die Verwendung von @SpringBootApplication(scanBasePackages = {"app1"}) könnte sogar noch nützlicher sein, da nicht nur das Servicepaket, sondern das gesamte App1-Paket gescannt wird.

+0

Ich habe "ArchiveService" in ein eigenes Paket verschoben, da es ein Problem mit dem Komponenten-Scan verursacht hat. Ist dies die einzige Möglichkeit, den Service zu laden? Ich habe das obige Update hinzugefügt. – ALM

+0

dnz, beachten Sie, dass [App1 und App2 auf verschiedenen Servern ausgeführt werden] (http://stackoverflow.com/questions/39605088/unable-to-get-service-wired-correctly-with-spring-data-jpa-no -qualifying-bean? noredirect = 1 # comment66518958_39605088). 'ArchiveService' ist nicht einmal in App2 vorhanden, wo' HomeController' ist. OP ist verwirrt darüber, was Auto-Verdrahtung tun kann, und denkt, dass es magisch automatisch zwischen Servern verdrahten wird. * * – Andreas

+0

Oh danke @Andreas Ich habe das nicht bemerkt. Dann ist es unmöglich, es von einem zum anderen zu verweisen.Und ALM kann ich fragen, warum Sie Anwendungen auf verschiedenen Servern bereitstellen und warum haben Sie eine andere App für Modell-/Repository-Definitionen, anstatt sie nur unter einem anderen Paket zu haben? – dnzprmksz

Verwandte Themen