我知道关于这个问题的许多类似问题,但是,他们没有解决我的问题。我有一个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
.....
答案 0 :(得分:2)
存储库必须位于主(应用程序)类的相同包装或子包中。这是spring boot中的默认行为。为了保持清洁,您还可以将回购放置在子包中,例如com.example.rest.repo
。或者当M. Deinum消化时,你可以将主类放在基础包中,以便spring可以自动处理。