注入自动装配的依赖项失败,无法自动装配字段
Posted
技术标签:
【中文标题】注入自动装配的依赖项失败,无法自动装配字段【英文标题】:Injection of autowired dependencies failed, Could not autowire field 【发布时间】:2016-08-17 02:45:05 【问题描述】:我知道这个问题被问了很多,我冒着双重(或三重或四重)主题的风险,但建议的解决方案似乎对我不起作用。
我遇到了非常可怕的无法自动接线错误。第一次从头开始建立一个完整的Spring项目,所以我真的不知道问题是什么。
这是我当前的设置: 项目回购:
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>
项目服务:
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>
...
错误:
严重:向 org.springframework.web.context.ContextLoaderListener 类的侦听器实例发送上下文初始化事件的异常 org.springframework.beans.factory.BeanCreationException:创建名为“projectRestController”的bean时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 be.italent.services.ProjectService be.italent.controllers.ProjectRestController.projectService;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“projectService”的 bean 时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 be.italent.repo.ProjectRepo be.italent.services.ProjectService.projectRepo;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [be.italent.repo.ProjectRepo] 的合格 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 在 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5068) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5584) 在 org.apache.catalina.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.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 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:无法自动装配字段:私有 be.italent.repo.ProjectRepo be.italent.services.ProjectService.projectRepo;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [be.italent.repo.ProjectRepo] 的合格 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ... 22 更多 原因:org.springframework.beans.factory.BeanCreationException:创建名为“projectService”的bean时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 be.italent.repo.ProjectRepo be.italent.services.ProjectService.projectRepo;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [be.italent.repo.ProjectRepo] 的合格 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1014) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:957) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$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:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ... 35 更多 引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖找到[be.italent.repo.ProjectRepo]类型的合格bean:预计至少有1个bean有资格作为此依赖的自动装配候选者。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1100) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) ... 37 更多
有什么帮助吗?谢谢!
解决方案
将此添加到我的 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】:问题出在 ProjectRestController.java 您已将 @Autowired 用于 ProjectService 1)
-
删除@Autowired 注释。
从
projectService
生成getter 和setter。
在spring.xml中为ProjectService
设置一个Bean
现在运行您的应用程序。它对我有用。
【讨论】:
这有什么改变?您只是在使用不同的配置编写相同的代码。他使用了@Autowired。您在 xml 中使用相同的概念! 你试过这个吗?...我有同样的错误,并尝试了一路。关注很多文章。但它没有用。这就是我使用 spring.xml 注入这些东西的原因。请记住,您不需要更改所有 @Autowired 注入。您只需要找到该类并将 getter setter 与 spring.xml 一起使用。【参考方案2】:当初始化应用程序上下文时出现问题时,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
// ...
【讨论】:
做到了,更新了我原来的帖子! + 100 问题是 - Spring Data 提供代理类 - 子类,它们在运行时为存储库接口提供具体类。在这里,您已经定义了 @Repository 但未启用数据 jpa。所以它不能提供一个具体的代理。上下文无法找到您的 repo 接口和 baaam 的具体 impl - 它大声喊叫它找不到 impl - 您无法实例化接口。 :)以上是关于注入自动装配的依赖项失败,无法自动装配字段的主要内容,如果未能解决你的问题,请参考以下文章
创建名为“securityConfig”的 bean 时出错:注入自动装配的依赖项失败
创建名为“homeController”的 bean 时出错:自动装配依赖项的注入失败
这是 MVC DAO 的正确方法吗?我收到类似自动装配依赖项注入失败的错误
Spring data jpa-未定义名为“entityManagerFactory”的bean;注入自动装配的依赖项失败