Ошибка при переопределении чтения метода в чтении типажей

Я пишу игровое приложение 2.3 (используя Scala). Я использую безопасный социальный модуль (мастер). Теперь я создал свой пользовательский класс:

class LoginUser(
    providerId: String,
    userId: String,
    firstName: Option[String],
    lastName: Option[String],
    fullName: Option[String],
    email: Option[String],
    avatarUrl: Option[String],
    authMethod: AuthenticationMethod,
    oAuth1Info: Option[OAuth1Info] = None,
    oAuth2Info: Option[OAuth2Info] = None,
    passwordInfo: Option[PasswordInfo] = None
               ) extends BasicProfile(providerId, userId, firstName, lastName, fullName,
                                      email, avatarUrl,authMethod, oAuth1Info, oAuth2Info,
                                      passwordInfo)

Для чтения/записи даты пользователя в моем mongodb я пишу неявный объект:

object LoginUser {
  implicit val authenticationMethodFormat = Json.format[AuthenticationMethod]
  implicit val oAuth1InfoFormat = Json.format[OAuth1Info]
  implicit val oAuth2InfoFormat = Json.format[OAuth2Info]
  implicit val passwordInfoFormat = Json.format[PasswordInfo]
  implicit val profileFormat = Json.format[BasicProfile]
  implicit object LoginUserFormat extends Format[LoginUser] {
    def writes(user: LoginUser): JsValue = Json.obj(
        "providerId" -> user.providerId,
        "userId" -> user.userId,
        "firstName" -> user.firstName,
        "lastName" -> user.lastName,
        "fullName" -> user.fullName,
        "email" -> user.email,
        "avatarUrl" -> user.avatarUrl,
        "authMethod" -> user.authMethod,
        "oAuth1Info" -> user.oAuth1Info,
        "oAuth2Info" -> user.oAuth2Info,
        "passwordInfo" -> user.passwordInfo)
   def reads(json: JsValue): LoginUser = new LoginUser(
       (json \ "providerId").as[String],
       (json \ "userId").as[String],
       (json \ "firstName").as[Option[String]],
       (json \ "lastName").as[Option[String]],
       (json \ "fullName").as[Option[String]],
       (json \ "email").as[Option[String]],
       (json \ "avatarUrl").as[Option[String]],
       (json \ "authMethod").as[AuthenticationMethod],
       (json \ "oAuth1Info").as[Option[OAuth1Info]],
       (json \ "oAuth2Info").as[Option[OAuth2Info]],
       (json \ "passswordInfo").as[Option[PasswordInfo]]
       )


  } 

Но компилятор сообщает мне следующую ошибку:

[error] /Users/alberto/git/recommendation-system/app/security/UserService.scala:60: overriding method reads in trait Reads of type (json: play.api.libs.json.JsValue)play.api.libs.json.JsResult[security.LoginUser];
[error]  method reads has incompatible type
[error]    def reads(json: JsValue): LoginUser = new LoginUser(
[error]        ^
[error] one error found
[error] (compile:compile) Compilation failed

Что случилось??


person alberto adami    schedule 23.09.2014    source источник
comment
Вместо этого рассмотрите возможность использования комбинаторов JSON. Использование as[T] вызовет исключение, если тип не соответствует, вместо возврата какой-либо проверки.   -  person Michael Zajac    schedule 23.09.2014


Ответы (1)


overriding method reads in trait Reads of type (json: play.api.libs.json.JsValue)play.api.libs.json.JsResult[security.LoginUser];
[error]  method reads has incompatible type

означает, что сигнатура метода reads в признаке Reads равна

def read(json:JsValue) : JsResult[LoginUser]

Поскольку вы пытались реализовать

def read(json:JsValue) : LoginUser

ваша сигнатура метода столкнулась с сигнатурой базового признака и, следовательно, не удалась.

person Edmondo1984    schedule 23.09.2014