在 Spring 中使用 @Autowired 注解时出现以下错误应该如何解决?

Posted

技术标签:

【中文标题】在 Spring 中使用 @Autowired 注解时出现以下错误应该如何解决?【英文标题】:How should I solve the following error I get when using @Autowired annotation in Spring? 【发布时间】:2020-02-22 17:44:56 【问题描述】:

我是 Spring 新手,在尝试使用 @Autowired 注释时遇到一些问题,尝试在 PostController 中注入 Repository 类

@Controller
@RequestMapping("/posts")

public class PostController 


    @Autowired 
    private Repository repository;


    @RequestMapping(value="",method= RequestMethod.GET)
    public String listPosts(Model model)
        model.addAttribute("posts",repository.findAll());
        return "posts/lists";
    


public interface Repository extends CrudRepository<Posts,Long> 

这些是我收到的错误消息

线程“main”中的异常 org.springframework.beans.factory.BeanCreationException:创建名为“postController”的 bean 时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有域.Repository controllers.PostController.repository;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [domain.Repository] ​​的合格 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1208) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:759) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 在 org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:117) 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:689) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:321) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:969) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:958) 在 MyApplication.main(MyApplication.java:7) 引起:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有域.Repository controllers.PostController.repository;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [domain.Repository] ​​的合格 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ... 16 更多 原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型 [domain.Repository] ​​的合格 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) ... 18 更多

【问题讨论】:

使用二传手?还是将其声明为对构造函数的依赖? 用@Repository 注释你的存储库(但为你的界面选择一个更具体的名称) 同意@Erwin Bolwidt 请使用@Repository 注释您的存储库接口并更改您的存储库接口名称,如PostsRepository 【参考方案1】:

您必须创建自己的存储库并从存储库扩展它,现在您使用的是 spring Repository 接口。

@Repository
public interface PostRepository extends CrudRepository<Posts,Long> 


然后@Autowire 它

@Autowired 
private PostRepository repository;

【讨论】:

【参考方案2】:

看你的日志我建议你验证两点:

domainRepository 用 @Component 注释? 如果应用程序启动到 controllers 包中,它将仅解析 controllers 包下的类,即不包括 domain 包( 存储库在哪里)

对于第二点快速修复,您可以重新排列 myapp 包下的包并让 spring 应用程序从该级别的类开始,或者更多generic configurations

【讨论】:

【参考方案3】:

对于 jpa、hibernate 的良好实践,尤其是为了更好地处理持久性异常,您必须将 @Repository 注释添加到所有存储库。

@Repository
public interface PostRepository extends CrudRepository<Posts,Long> 


现在要实例化存储库类,您必须将其设为公开。

@Autowired 
PostRepository postRepository;

还提到,作为一种良好做法,您创建一个服务来处理使用您的存储库的流程的所有逻辑。

【讨论】:

【参考方案4】:

这里的异常是 NoSuchBeanDefinitionException 。

基于javadoc-api

public class NoSuchBeanDefinitionException
extends BeansException

Exception thrown when a BeanFactory is asked for a bean instance for which it cannot find a definition. This may point to a non-existing bean, a non-unique bean, or a manually registered singleton instance without an associated bean definition.

有许多可能导致此异常。请通读此详细说明以获得完整的图片。 -> What is a NoSuchBeanDefinitionException and how do I fix it?

【讨论】:

以上是关于在 Spring 中使用 @Autowired 注解时出现以下错误应该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

Spring系列

SpringBoot @Autowired中注入静态方法或者静态变量

Spring相关知识点

Spring学习-----Spring使用@Autowired注解自动装配

如何在 Spring Boot 中手动新建实例中使用 @Autowired

spring自动注入的三种方式