Spring Boot 在主类中定义时找不到Bcrypt Bean,在主类中注入时其他服务Bean也出现相同问题

sgtfey8w  于 2022-11-05  发布在  Spring
关注(0)|答案(1)|浏览(135)

我创建了这个简单的项目来测试另一个项目中的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) {
        // ...
    }
}

"先谢谢你"

z18hc3ub

z18hc3ub1#

这是因为在CommandUser类中,你说你需要一个BCryptPasswordEncoder,但是你创建的bean是一个PasswordEncoder。你可以通过修改你的CommandUser类来注入接口来解决这个问题,就像这样:

@Service
@RequiredArgsConstructor
public class CommandUser {

   private final PasswordEncoder passwordEncoder;

   public void doSomething(String arg) {
     // ...
   }
}

相关问题