Spring Boot认证中loadUserByUsername报overrides nothing错误求助
问题1:
loadUserByUsername overrides nothing 编译错误 该错误出现的核心原因是JwtUserDetailsService实现Spring Security的UserDetailsService接口时,方法签名和接口定义不匹配,Kotlin对方法签名的匹配要求非常严格,包括参数类型、可空性、返回值可空性都必须完全一致才可以正常覆盖。
解决步骤:
- 确认
JwtUserDetailsService明确实现了org.springframework.security.core.userdetails.UserDetailsService接口 - 方法签名严格按照官方定义书写,参考示例:
override fun loadUserByUsername(username: String): UserDetails { // 你的业务逻辑 }
- 不要自行修改参数为可空类型
String?,也不要修改返回值为可空类型UserDetails?,否则都会触发覆盖失败的编译错误。
问题2:无法访问
user.userId.email和user.userId.password 该问题属于跨服务数据模型不匹配导致的属性访问失败,你的认证服务中定义的User类userId字段结构,和用户注册服务返回的实际数据结构不一致,提供两种可落地的解决方案:
方案1:调整认证服务User类结构匹配注册服务返回值
如果注册服务返回的UserRegistration对象直接包含email、password字段,直接调整认证服务的User类字段结构即可,参考示例:
// 调整后的User.kt data class User( val id: Long, val email: String, val password: String, // 其他业务所需字段 )
你之前将邮箱、密码嵌套在userId字段下的结构和注册服务返回结构不匹配,所以无法访问到对应属性。
方案2:手动映射跨服务返回的字段
如果你不需要调整现有User类结构,可以在调用注册服务拿到返回结果后,手动把字段映射到你的User类中,参考示例:
// 调用注册服务拿到UserRegistration实例后手动赋值 val user = User( userId = UserId( email = userRegistration.email, password = userRegistration.password ), // 其他字段赋值 )
同时需要确认你的UserId类是公共可见的,email和password字段没有加private修饰符,Kotlin默认data class的字段都是公共可见的,如有私有修饰直接删除即可。
验证返回Spring Security User实例的逻辑
最后确认你构造org.springframework.security.core.userdetails.User实例的参数正确,参考示例:
return org.springframework.security.core.userdetails.User( user.email, // 替换为你实际取到的用户名字段 user.password, // 替换为你实际取到的密码字段 emptyList() // 替换为你实际的用户权限列表 )
内容的提问来源于stack exchange,提问作者Mama
相关产品推荐
相关产品推荐

