在 Spring Boot 中的多个包上使用 @ComponentScan 时出错

Posted

技术标签:

【中文标题】在 Spring Boot 中的多个包上使用 @ComponentScan 时出错【英文标题】:Error with using @ComponentScan on multiple packages in Spring Boot 【发布时间】:2022-01-15 21:52:10 【问题描述】:

这是我的问题——我有一项依赖于外部库的服务。我试图自动连接服务,以便我可以使用它但无法

import org.keycloak.admin.client.token.TokenService;

public class SimpleService 

   @Autowired
   private TokenService keycloakTokenSvc; // Could not autowire, no beans of type 'TokenService' found
 
   public void execute() 
       keyCloakTokenSvc.doSomething();
   
   


然后我将它添加到我的 SpringBootApplication 并让它工作:

@SpringBootApplication
@ComponentScan("org.keycloak.admin.client.token")
public MyApp 

甜蜜——现在一切都好,对吧?没有。这似乎覆盖了我的一些自动配置,比如我的安全配置,所以我不再在我的应用程序运行时向它发出 RESTful 请求。然后我接下来做了这个:

@SpringBootApplication
@ComponentScan("org.keycloak.admin.client.token", "com.project.pkg")
public MyApp 

还是什么都没有。我得到和以前一样的错误:

Field keycloakTokenSvc in com.mark43.jms.services.TokenRefreshService required a bean of type 'org.keycloak.admin.client.token.TokenService' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'org.keycloak.admin.client.token.TokenService' in your configuration.

我是 Spring Boot 的新手,所以不知道在这里做什么。有没有办法在没有自动装配的情况下使用TokenService?有没有办法扫描两个包?

【问题讨论】:

这是我项目之外的一个包,我不能注释它。您只能使用带注释的服务吗? 【参考方案1】:

在我看来,您需要创建一个TokenService bean,如下所示:

@Configuration
public class TokenConfig 
    @Bean
    public TokenService tokenService() 
        return new TokenService();  // Or whatever you need to instantiate it
    

这会将TokenService 对象注册为Spring 管理的bean,以便它可以自动装配到SimpleService

【讨论】:

我想我当时理解不正确。我无法实例化它,因为它是一个接口。 这行不通。 TokenService 只是一个接口,你不能在不知道实现类的情况下使用 new 关键字在接口上创建引用 好吧,如果TokenService 是一个接口,那么你需要一个这样的接口的实现。你是否有一个? Keycloak 提供一个吗?

以上是关于在 Spring Boot 中的多个包上使用 @ComponentScan 时出错的主要内容,如果未能解决你的问题,请参考以下文章

带有 Spring Boot 的 Spring Data JPA 中的多个数据源,[重复]

Spring boot配置多个Redis数据源操作实例

spring boot 中的多个 liquibase 配置

在 Spring Boot 中的多个连接器之间共享嵌入式 Tomcat 执行器

Hibernate 无法在多个包上正确操作

如何在JAVA JPA Spring Boot中的一个SQL查询中选择多个数据