@ComponentScan和@Autowired无法从特定包中注入

时间:2014-11-25 11:29:08

标签: java spring rest autowired component-scan

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

应用程序类:

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

}

Service类(Autowire在此处失败以注入actorRepository):

package com.example.services;

@Service
public class ActorService 
{
  @Autowired
  private ActorRepository actorRepository;
  ....
}

REST服务(Autowired无法注入actorService -I假设是因为ActorService无法注入ActorRepository):

package com.example.rest;

@RestController
@RequestMapping("/actors")

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

  @Autowired 
  private ActorService actorService;

  ....
}

我相信它之所以发生这种情况是因为@ComponentScan没有扫描存储库包是因为在STS中,Spring类在它们的右上角有一个小的Java图标。这出现在应扫描的所有类中(除了存储库包中的任何内容之外的组件)。将存储库类移动到其余包会使它们被扫描(不知道为什么!)。

当我尝试使用Spring Boot App运行项目时,这是我获得的一部分。

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 个答案:

答案 0 :(得分:2)

存储库必须位于主(应用程序)类的相同包装或子包中。这是spring boot中的默认行为。为了保持清洁,您还可以将回购放置在子包中,例如com.example.rest.repo。或者当M. Deinum消化时,你可以将主类放在基础包中,以便spring可以自动处理。