由于隐式参数错误,删除身份验证信息失败

时间:2018-05-09 09:12:40

标签: scala playframework silhouette

我使用Silhouette来管理Play应用程序中的身份验证。注册,登录和授权工作正常。但是,在尝试取消注册(=删除)用户帐户时,删除相应的身份验证信息将失败。

特别是,以下行抛出异常:

authInfoRepository.remove(LoginInfo(credentialsProvider.id, username))

authInfoRepository是注入的AuthInfoRepository,配置为DelegableAuthInfoRepository

例外:

com.mohiva.play.silhouette.api.exceptions.ConfigurationException: Cannot remove auth info of type: class scala.runtime.Nothing$; Please configure the DAO for this type
at com.mohiva.play.silhouette.persistence.repositories.DelegableAuthInfoRepository.remove(DelegableAuthInfoRepository.scala:115)
[...]

查看有问题的方法,它需要一个隐式参数implicit tag: ClassTag[T]。那个人不知何故最终成为Nothing,这在我看来是错误的,但我不能完全理解发生了什么,或者预期会发生什么。

  • 如何正确调用AuthInfoRepository#remove?我是否需要手动将ClassTag对象放入正确的上下文中以避免推断Nothing
  • 为什么隐式ClassTag参数甚至相关?

1 个答案:

答案 0 :(得分:1)

  

为什么隐式ClassTag参数甚至相关?

ClassTag是相关的,因为remove期望这样隐含:https://github.com/mohiva/play-silhouette/blob/master/silhouette-persistence/src/main/scala/com/mohiva/play/silhouette/persistence/repositories/DelegableAuthInfoRepository.scala#L104-L118

  

我是否需要手动将ClassTag对象放入正确的上下文中   避免推断Nothing

我反之亦然,您应该指定T(如果没有这样的指定,T现在被推断为Nothing),则会找到正确的隐式。

尝试以下选项之一:

authInfoRepository.remove[CasInfo](LoginInfo(credentialsProvider.id, username))
authInfoRepository.remove[OAuth1Info](LoginInfo(credentialsProvider.id, username))
authInfoRepository.remove[OAuth2Info](LoginInfo(credentialsProvider.id, username))
authInfoRepository.remove[OpenIDInfo](LoginInfo(credentialsProvider.id, username))
authInfoRepository.remove[PasswordInfo](LoginInfo(credentialsProvider.id, username))