2016-04-23 10 views
1

Ich weiß, dass diese Frage viel gefragt wurde und ich riskiere ein doppeltes (oder drei oder vierfaches) Thema, aber die vorgeschlagenen Lösungen scheinen nicht für mich zu arbeiten.Injection der autowired Abhängigkeiten fehlgeschlagen, Konnte Feld nicht autowire

Ich habe Probleme mit dem viel gefürchteten kann nicht automatisch Fehler. Das erste Mal, dass ich ein komplettes Spring-Projekt von Grund auf neu aufgesetzt habe, weiß ich nicht wirklich, was das Problem ist.

Dies ist meine aktuelle Setup: ProjectRepo:

package be.italent.repo; 

import be.italent.model.Project; 
import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.stereotype.Repository; 

@Repository 
public interface ProjectRepo extends JpaRepository<Project, Integer> { 

} 

ProjectService:

package be.italent.services; 

import be.italent.model.Project; 
import be.italent.repo.ProjectRepo; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

import java.util.List; 

@Service 
public class ProjectService { 

    @Autowired 
    private ProjectRepo projectRepo; 

    public List<Project> getAllProjects() { 
     return projectRepo.findAll(); 
    } 
} 

ProjectRestController:

package be.italent.controllers; 

import java.util.ArrayList; 
import be.italent.services.ProjectService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 
import be.italent.model.Project; 

@RestController 
@RequestMapping("/projects") 
public class ProjectRestController { 

    @Autowired 
    private ProjectService projectService; 

    @RequestMapping(method = RequestMethod.GET, produces="application/json") 
    public ArrayList<Project> getProjects(){ 
     ArrayList<Project> c = (ArrayList<Project>) projectService.getAllProjects(); 

     return c; 
    } 
} 

feder mvc.xml

... 
<context:component-scan base-package="be.italent"></context:component-scan> 
... 

Fehler:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'projectRestController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private be.italent.services.ProjectService be.italent.controllers.ProjectRestController.projectService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'projectService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private be.italent.repo.ProjectRepo be.italent.services.ProjectService.projectRepo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [be.italent.repo.ProjectRepo] 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)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5068) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5584) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1572) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1562) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private be.italent.services.ProjectService be.italent.controllers.ProjectRestController.projectService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'projectService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private be.italent.repo.ProjectRepo be.italent.services.ProjectService.projectRepo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [be.italent.repo.ProjectRepo] 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)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ... 22 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'projectService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private be.italent.repo.ProjectRepo be.italent.services.ProjectService.projectRepo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [be.italent.repo.ProjectRepo] 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)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1014) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:957) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) ... 24 more Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private be.italent.repo.ProjectRepo be.italent.services.ProjectService.projectRepo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [be.italent.repo.ProjectRepo] 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)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ... 35 more Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [be.italent.repo.ProjectRepo] 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)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1100) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) ... 37 more

Jede Hilfe? Vielen Dank!

Lösung

hat dieses Bild meiner Feder-mvc.xml:

<beans 
... 
jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> 

... 

<jpa:repositories base-package="be.italent.repo" entity-manager-factory-ref="emf"/> 

Antwort

3

Wenn etwas nicht in Ordnung ist, wenn Sie den Anwendungskontext der Initialisierung gibt Frühlings oft diese langen Stack-Traces. Normalerweise können Sie herausfinden, was die ultimative Ursache ist, indem Sie auf den unteren Teil der Stack-Spur schauen.

In Ihrem Fall sehen Sie diese Fehlermeldung am unteren Rande:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [be.italent.repo.ProjectRepo] found

Das bedeutet, dass der Frühling nicht eine Bohne vom Typ ProjectRepo finden.

Ihre ProjectRepo Repository-Schnittstelle ist im Paket be.italent.repo, die eine subpackage von be.italent ist, die Komponente abgetastet ist, so dass das Problem ist nicht, dass es in einem falschen Paket.

Haben Sie vergessen, Spring Data JPA zu aktivieren?

Wenn Sie XML-Konfiguration verwenden (wie Sie es jetzt tun), können Sie ein repositories XML-Tag in Ihrer Konfigurationsdatei haben müssen:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/data/jpa 
      http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> 

    <!-- Tell Spring Data JPA where your repository interfaces are --> 
    <jpa:repositories base-package="be.italent.repo" /> 

    <!-- ... --> 
</beans> 

Wenn Sie JavaConfig verwenden, können Sie es mit einer Anmerkung tun:

@Configuration 
@EnableJpaRepositories("be.italent.repo") 
public class MySpringConfiguration { 
    // ... 
} 
+0

Das tat es, meinen ursprünglichen Posten aktualisierend! – Daemun