gpt4 book ai didi

java - @ComponentScan 和 @Autowired 无法从特定包注入(inject)

转载 作者:行者123 更新时间:2023-11-30 03:39:22 24 4
gpt4 key购买 nike

我知道 SO 上有很多关于此问题的类似问题,但是没有一个解决了我的问题。我有一个 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 在此处注入(inject) actorRepository 失败):

package com.example.services;

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

REST服务(Autowired无法注入(inject)actorService - 我认为这是因为ActorService无法注入(inject)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 图标右上角有一个小 S。这出现在所有应该扫描的类上(除了存储库包中的任何内容之外的组件)。将存储库类移动到其余包会使它们被扫描(不知道为什么!)。

这是我尝试使用 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

.....

最佳答案

存储库必须位于主(应用程序)类的同一包或子包中。这是 Spring Boot 中的默认行为。为了保持干净,您还可以将存储库放入子包中,例如您的情况下的 com.example.rest.repo 。或者正如 M. Deinum 建议的那样,您可以将主类放在基础包中,以便 spring 可以自动处理。

关于java - @ComponentScan 和 @Autowired 无法从特定包注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27125467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com