Play+Silhouette+Cassandra应用已实现方法仍报未实现错误
解决Silhouette AuthInfoRepository实现仍提示未实现成员的问题
这种明明已经写了方法实现,却还是被IDE或编译器提示“需声明为抽象类”的情况,我之前在Play+Silhouette项目里也碰到过,大概率是几个细节没对齐,咱们一步步排查:
检查方法签名的完全一致性
这是最常见的原因!你得确保实现的每个方法和AuthInfoRepository接口里的签名完全一致,包括:- 泛型约束:比如
def add[T <: AuthInfo](...)里的T <: AuthInfo不能少,也不能改成别的约束 - 参数类型:确认
LoginInfo和AuthInfo都是com.mohiva.play.silhouette.api包下的,不是你自己定义的同名类 - 返回值类型:比如是不是返回了
Future[T]而不是Future[Unit]或者其他类型 - 方法名:别把
update写成modify这种拼写错误
- 泛型约束:比如
确认继承关系正确
检查你的UsersRepository类是不是明确实现了AuthInfoRepository接口,比如类定义是不是:import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository class UsersRepository @Inject()(...) extends AuthInfoRepository { // 方法实现 }有时候不小心继承了别的抽象类,或者接口名写错(比如少写了
Repository后缀),都会导致编译器认为你没实现目标接口的方法。排查IDE缓存或编译缓存问题
有时候IDE(比如IntelliJ IDEA)的缓存会出现“脑抽”情况,明明代码正确却报错。可以试试:- 执行sbt命令:
clean compile清理编译缓存并重新编译 - 清理IDE缓存:IntelliJ里选
File -> Invalidate Caches...,然后重启IDE
- 执行sbt命令:
检查方法可见性
Scala里默认方法是public的,但如果你不小心给实现的方法加了private或protected修饰符,编译器会认为这个方法不是接口的实现,依然判定为未实现成员。确保所有接口方法的实现都是public的(不用加修饰符就行)。核对Silhouette版本的API兼容性
不同版本的Silhouette可能会修改AuthInfoRepository的方法签名或数量,比如某个版本新增了方法,或者改变了泛型约束。你可以对照你当前使用的Silhouette版本的API定义,确认需要实现的方法列表和签名是否和你写的一致。
举个符合要求的实现示例:
import com.mohiva.play.silhouette.api.LoginInfo import com.mohiva.play.silhouette.api.AuthInfo import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository import scala.concurrent.Future import javax.inject.Inject class UsersRepository @Inject()(...) extends AuthInfoRepository { override def add[T <: AuthInfo](loginInfo: LoginInfo, authInfo: T): Future[T] = { // 你的Cassandra存储逻辑 } override def update[T <: AuthInfo](loginInfo: LoginInfo, authInfo: T): Future[T] = { // 你的更新逻辑 } override def find[T <: AuthInfo](loginInfo: LoginInfo, clazz: Class[T]): Future[Option[T]] = { // 你的查询逻辑 } // 其他需要实现的方法(比如remove、findAll等) }
内容的提问来源于stack exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

