2014-11-07 2 views
2

У меня есть класс контроллера, где я разместил объект записи для сериализации объекта пользователя. К сожалению, произошла ошибка при получении для user.getId:Устранение несогласованности типа с серией Serialization ScalaJson

type mismatch; found : Long required: play.api.libs.json.Json.JsValueWrapper 
Note: implicit value userWrites is not applicable here because it comes 
after the application point and it lacks an explicit result type 

Вот мой код:

object UsersController extends Controller { 

    implicit val userWrites = new Writes[User] { 
    def writes(user: User) = Json.obj(
     "id" -> user.getId, 
     "username" -> user.getUsername 
    ) 
    } 

    def users = Action { implicit request => 
    Ok(views.html.users()) 
    } 
} 

Я не знаю, почему ошибка говорит, «Примечание: неявное значение userWrites не применимо здесь ... ", потому что, если я избавлюсь от части user.getId, ошибка исчезнет.

Что мне нужно, чтобы избавиться от этой ошибки и правильно создать объект Writes для моего класса User.

+0

Как выглядит «Пользователь»? У 'getId' нет явного типа результата? Похоже, это то, что пытается сказать вам компилятор scala, и в этом случае вы должны предоставить его так: 'implicit Writes [Long]' или все, что может быть разрешено. –

+0

Пользователь java-объект, так что да, он возвращает Long. Вот почему он говорит: «found: Long» –

+0

Тот факт, что 'User' является объектом java, а не scala-объектом, имеет решающее значение, потому что это, скорее всего, корень проблемы. У него проблемы с поиском того, какой тип сериализовать 'user.getId' для. –

ответ

2

Java Long - это не Scala Long, а Play Scala JSON-сериализаторы поддерживают только типы Scala. Вы можете конвертировать напрямую через Long2long:

implicit val userWrites = new Writes[User] { 
    def writes(user: User) = Json.obj(
    "id" -> Long2long(user.getId), 
    "username" -> user.getUsername 
) 
} 
Смежные вопросы