Удаление информации об аутентификации завершается неудачно из-за неверного неявного параметра - PullRequest
0 голосов
/ 09 мая 2018

Я использую 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 голосов
/ 09 мая 2018

Почему неявный параметр 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))
...