我创建了这个简单的项目来测试另一个项目中的bug。我有一个主类(AppApplication)和一个服务类(CommandUser)。目标是在CommandUser类上使用main类中声明的bean,并在main类中使用bean CommandUser(作为run()方法的参数)。
第一个问题是whithout @ComponentScan({“com.example. app. *"}),应用程序无法启动并报告以下情况:
Parameter 0 of constructor in com.example.app.CommandUser required a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' that could not be found.
它找不到Bcrypt bean,但它在主类中定义。
在put @ComponentScan({“com.example.app.*"})之后,它修复了Bcrypt bean的问题,但报告了另一个错误,即在主类中缺少用作run()方法参数的bean CommandUser:
Parameter 0 of method run in com.example.app.AclsApplication required a bean of type 'com.example.app.CommandUser' that could not be found.
同样,它也找不到另一个bean,在本例中是CommandUser,它是我用@Service标注的一个服务类。
如果没有@ComponentScan,它将识别主类上的CommandUser Bean(作为run()方法参数),但Bcrypt Bean继续出现相同的问题。
我认为问题出在AppApplication类上,因为如果我使用CommandUser bean,它在另一个类中工作。
项目结构为:
com.example.app/
> AppApplication
> CommandUser
注:类是在同一水平,我知道这是错误的,为真实的的应用程序,但它只是一个测试。
AppApplication主类(使用main()):
@ComponentScan({"com.example.app.*"})
@SpringBootApplication
public class AppApplication {
public static void main(String[] args) {
SpringApplication.run(AclsApplication.class, args);
}
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Bean
CommandLineRunner run(CommandUser commandUser){
return args -> {
// ...
};
}
}
CommandUser服务类别(Bean):
@Service
@RequiredArgsConstructor
public class CommandUser {
private final BCryptPasswordEncoder bCryptPasswordEncoder;
public void doSomething(String arg) {
// ...
}
}
"先谢谢你"
1条答案
按热度按时间z18hc3ub1#
这是因为在
CommandUser
类中,你说你需要一个BCryptPasswordEncoder
,但是你创建的bean是一个PasswordEncoder
。你可以通过修改你的CommandUser
类来注入接口来解决这个问题,就像这样: