首页 文章

注入自动装配的依赖项失败,无法自动装配字段

提问于
浏览
2

我知道这个问题已经被问了很多,我冒了一个双重(或三重或四重)的话题,但建议的解决方案似乎对我不起作用 .

我遇到了很多可怕的无法自动发送错误的问题 . 第一次从头开始设置一个完整的Spring项目,所以我真的不知道问题是什么 .

这是我目前的设置: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;
    }
}

spring mvc.xml

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

错误:

SEVERE:异常将上下文初始化事件发送到类的监听器实例org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException:创建名为'projectRestController'的bean时出错:注入自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private be.italent.services.ProjectService be.italent.controllers.ProjectRestController.projectService;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为'projectService'的bean时出错:注入自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private be.italent.repo.ProjectRepo be.italent.services.ProjectService.projectRepo;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为[be.italent.repo.ProjectRepo]的限定bean:期望至少有一个bean可以作为此依赖项的autowire候选者 . 依赖注释:{org.springframework.beans.factory.annotation.Autowired(required = true)}位于org.springframework.beans的org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) . factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(位于org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:304)的org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)处的AbstractAutowireCapableBeanFactory.java:475) org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java :300)在org.springframework的org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) . 在org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java)的org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)上的context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760): 403)org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)org.apringframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)at org.apache.catalina.core.StandardContext .listenerStart(StandardContext.java:5068)位于org.apache.catali的org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5584) na.util.LifecycleBase.start(LifecycleBase.java:147)位于org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1572)org.apache.catalina.core.ContainerBase $ StartChild.call( ContainerBase.java:1562)java.util.conc当前的java.util.concurrent.FutureTask.run(FutureTask.java:266)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)java.util.concurrent.ThreadPoolExecutor $ Worker .run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:745)引起:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private be.italent.services.ProjectService be.italent.controllers.ProjectRestController.projectService;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为'projectService'的bean时出错:注入自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private be.italent.repo.ProjectRepo be.italent.services.ProjectService.projectRepo;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为[be.italent.repo.ProjectRepo]的限定bean:期望至少有一个bean可以作为此依赖项的autowire候选者 . 依赖注释:org.springframework.beans.factory上的org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)中的{@ org.springframework.beans.factory.annotation.Autowired(required = true)} .annotation.InjectionMetadata.inject(InjectionMetadata.java:87)at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)... 22更多引起:org.springframework.beans.factory . BeanCreationException:创建名为'projectService'的bean时出错:注入自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private be.italent.repo.ProjectRepo be.italent.services.ProjectService.projectRepo;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为[be.italent.repo.ProjectRepo]的限定bean:期望至少有一个bean可以作为此依赖项的autowire候选者 . 依赖注释:{org.springframework.beans.factory.annotation.Autowired(required = true)}位于org.springframework.beans的org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) . 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)上的factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)位于org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:304)的org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)处的AbstractAutowireCapableBeanFactory.java:475) org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java :300)在org.springframework的org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1014) . bean.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:957)位于org.springframework.beans.factory.factory.ApreowiredAnnotationBeanPostProcessor上的org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855) AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)... 24更多引起:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private be.italent.repo.ProjectRepo be.italent.services.ProjectService.projectRepo ;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为[be.italent.repo.ProjectRepo]的限定bean:期望至少有一个bean可以作为此依赖项的autowire候选者 . 依赖注释:{org.springframework.beans.factory.annotation.Autowired(required = true)}在org.springframework的org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) . beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)... 35更多引起:org.springframework.beans .factory.NoSuchBeanDefinitionException:没有为依赖项找到[be.italent.repo.ProjectRepo]类型的限定bean:期望至少有一个bean可以作为此依赖项的autowire候选者 . 依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}位于org.springframework.beans的org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1100) . or.s.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855)中的factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)位于org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement . inject(AutowiredAnnotationBeanPostProcessor.java:480)......还有37个

有帮助吗?谢谢!

Solution

将此添加到我的spring-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"/>

1 回答

  • 3

    当初始化应用程序上下文时出现问题时,Spring经常会给出这些长堆栈跟踪 . 通常,您可以通过查看堆栈跟踪的底部来找出最终原因 .

    在您的情况下,您会在底部看到此错误消息:

    org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到[be.italent.repo.ProjectRepo]类型的限定bean

    这意味着Spring找不到 ProjectRepo 类型的bean .

    您的 ProjectRepo 存储库接口位于 be.italent.repo 包中,它是 be.italent 的子包,它是组件扫描的,因此问题不在于它是在错误的包中 .

    您是否忘记启用Spring Data JPA?

    当您使用XML配置时(正如您现在所做的那样),您必须在配置文件中包含 repositories XML标记:

    <?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>
    

    使用JavaConfig时,可以使用注释执行此操作:

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

相关问题