Spring Security中CustomUserDetailsService无法自动装配问题求助
核心问题
你遇到的注入错误,根源在于自定义的CustomUserDetailsService接口没有被实现类正确实现,导致Spring容器中不存在该类型的Bean。
看原代码的实现类:
@Service class CustomUserDetailsServiceImpl(val accountService:AccountService): UserDetailsService { // ...实现代码 }
这里CustomUserDetailsServiceImpl直接实现的是Spring Security的UserDetailsService接口,而非你自己定义的CustomUserDetailsService接口。这意味着Spring容器中只会存在一个UserDetailsService类型的Bean,而没有CustomUserDetailsService类型的Bean,所以在SecurityConfig中注入CustomUserDetailsService时会提示找不到对应类型的Bean。
而你修改后的代码,直接把实现类命名为CustomUserDetailsService并标注@Service,此时这个类本身就是一个被Spring管理的Bean,类型就是CustomUserDetailsService,所以注入时能正常匹配。
正确的常规写法(保留接口+实现类的模式)
如果你想保留接口和实现类的分离结构,只需要让实现类实现你自定义的CustomUserDetailsService接口即可:
interface CustomUserDetailsService: UserDetailsService { override fun loadUserByUsername(username: String?): CustomUserDetails } @Service // 改为实现自定义的CustomUserDetailsService接口 class CustomUserDetailsServiceImpl(val accountService:AccountService): CustomUserDetailsService { override fun loadUserByUsername(username: String?): CustomUserDetails { try { val account = accountService.findByEmail(username!!) return CustomUserDetails(account) } catch (e: Exception) { throw e } } }
这样Spring容器中就会存在一个CustomUserDetailsService类型的Bean(由CustomUserDetailsServiceImpl实例化),注入时就能正常匹配。
为什么JwtService没有问题?
你提到的JwtService应该是直接用@Service标注的类(没有额外的接口,或者实现了自己的接口且实现类正确关联),所以Spring容器中存在对应类型的Bean,注入时自然不会报错。
内容的提问来源于stack exchange,提问作者iknow kim

