在 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 中的多个数据源,[重复]