当前位置: 首页 > 知识库问答 >
问题:

@componentscan和@autowired无法从特定包中注入

杜焕
2023-03-14

我知道关于这个问题有很多类似的问题,但是,没有一个解决了我的问题。我有一个Spring REST项目,我正在使用Spring Tool Suite(STS)3.5.1版本。

应用程序类:

package com.example.rest;

@ComponentScan({"com.example.repositories", "com.example.config", "com.example.services",    "com.example.rest", "com.example.jms"})
@EnableAutoConfiguration
public class Application 
{
  ... //declaring some beans for JMS
}
package com.example.repositories;

@Repository
public interface ActorRepository extends MongoRepository<Actor, String> 
{

   public Actor findByFNameAndLName(String fName, String lName);
   public Actor findByFName (String fName);
   public Actor findByLName(String lName);

}
package com.example.services;

@Service
public class ActorService 
{
  @Autowired
  private ActorRepository actorRepository;
  ....
}
package com.example.rest;

@RestController
@RequestMapping("/actors")

public class ActorRESTService 
{
  private static final Logger logger = Logger.getLogger(ActorRESTService.class);

  @Autowired 
  private ActorService actorService;

  ....
}

这是当我尝试使用Spring Boot应用程序运行项目时得到的部分切除。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'actorService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.repositories.ActorRepository com.example.services.ActorService.actorRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.repositories.ActorRepository] 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:703)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:683)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:944)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:933)
at com.example.rest.Application.main(Application.java:94)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.repositories.ActorRepository com.example.services.ActorService.actorRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.repositories.ActorRepository] 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)
... 16 common frames omitted

 .....  

共有1个答案

卫建义
2023-03-14

存储库必须位于主(应用程序)类的同一个包或子包中。这是spring Boot中的默认行为。为了保持干净,您还可以将回购放在子包中,就像您的例子中的com.example.rest.repo一样。或者像M.Deinum sugested那样,您可以将主类放在基包中,这样spring就可以自动处理这个问题。

 类似资料:
  • 我想在Spring中从基于XML的配置切换到基于Java的配置。现在我们在应用程序上下文中有如下内容: ...它将从两个包中排除服务。我有一种强烈的感觉,我忽略了一些令人尴尬的琐碎事情,但我找不到一种解决方案来将过滤器的范围限制在。

  • 问题内容: 我想在Spring中从基于XML的配置切换为基于Java的配置。现在,我们的应用程序上下文中具有以下内容: 但是如果我写这样的话… …它将从这两个软件包中排除服务。我有一种强烈的感觉,我正在尴尬地忽略一些琐碎的事情,但是找不到解决方案来将过滤器的范围限制为。 问题答案: 你只需要为所需的两个注释创建两个类。 因此,例如,你的包装将有一个类: 然后是你的包裹的二等舱: 然后在实例化Spr

  • 问题内容: 我的测试课: 我在行上得到一个空指针异常: 在精确的给出空指针异常 如何使Junit类中的beanObject字段自动装配成为可能,以便可以使用“ BeanClass”类中的方法? 从评论中复制: 用简单的术语来说.. beanClass是具有某些方法的接口..我用 注释标记了该beanClass。.banClass 是由具有方法实现的beanClassImpl类实现的。.我需要在我的

  • > 我不能使基本包属性是动态的,即我不能传递,但需要在配置中预先定义包。 我查看了,但无法使其工作。 当我忽略基本包时,扫描从注释的定义包开始,而不是从注释类的包开始。在上面的示例中,它只扫描并创建中类的bean,而不扫描并创建中的bean。 如果将放在类上,则一切都可以工作,但当将其移动到的元注释时,将停止工作。如何告诉Spring Framework将视为使用某些默认值指定的另一种方式。我尝试

  • 是否可以让在整个spring boot项目中工作?现在,当我创建一个新包时,我需要将它添加到注释中,否则将找不到bean。如果允许在项目中到处搜索,是否会导致性能问题或其他问题?

  • 我想实现一些类似于Spring数据的东西。 在spring初始化期间,我需要获得所有接口的列表(适当地注释)<为接口创建动态代理,并将它们注入到需要的地方。 代理创建,创建bean注入就可以了。现在问题来了: 如何找到所有接口的列表? 因此,我需要一个基本包的完整列表,通过Spring扫描在包中找到我的接口(必须快得多)。 在SpringContext中肯定可以获得这些信息。我试图调试并查看bas