繁体   English   中英

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

[英]Injection of autowired dependencies failed, Could not autowire field

我知道这个问题被问了很多,我冒着双重(或三重或四重)主题的风险,但提议的解决方案似乎对我不起作用。

我遇到了可怕的无法自动装配错误的麻烦。 第一次从头开始搭建一个完整的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> {

}

项目服务:

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();
    }
}

项目休息控制器:

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:无法自动装配字段: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 依赖项:预计至少有 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.AbstractAutowireCapableBeanFactory.java:1185。 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) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) at 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.catali 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.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 依赖项:预计至少有 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) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ... 22个更多引起:org.springframe .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 依赖项:预计至少有 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.AbstractAutowireCapableBeanFactory.java:1185。 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) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855) at org.springframework.beans.beans.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 依赖项:预计至少有 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) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ... 35个更多引起:org.springframe ... 依赖注释:{@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) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855) at org.springframework.beans.factory.annotation.AutoProcesswiredElement.注入(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"/>

当初始化应用程序上下文时出现问题时,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 {
    // ...
}

问题出在 ProjectRestController.java 您已将 @Autowired 用于 ProjectService 1)

  1. 删除@Autowired 注释。
  2. projectService生成 getter 和 setter。
  3. 在 spring.xml 中为ProjectService设置一个 Bean

现在运行您的应用程序。 它对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM