Сериализация MongoRecord с использованием Lift - PullRequest
1 голос
/ 18 августа 2011

У меня проблемы с построением спокойного сервиса с лифтом. Все, что я хочу сделать на этом этапе, это сериализовать MongoRecord в JSON. Вот моя модель:

class Team extends MongoRecord[Team] with MongoId[Team] {
  def meta = Team

  object name extends StringField(this, 100)
  object slug extends StringField(this, 100)
}

object Team extends Team with MongoMetaRecord[Team] {
  def all = Team orderAsc (_.slug) fetch()

  def apply(in: JValue): Box[Team] = Helpers.tryo{in.extract[Team]}

  def unapply(in: String): Option[Team] = Team where (_.slug eqs in) get()

  implicit def toJson(team: Team): JValue =
    Extraction.decompose(team)

  implicit def toJson(teams: Seq[Team]): JValue =
    Extraction.decompose(teams)
}

А вот моя реализация RestHelper:

object TeamRestService extends RestHelper {
  serve( "api" / "teams" prefix {
    case Nil JsonGet _ => Team.all: JValue

    case Team(team) :: Nil JsonGet _ => team: JValue
  })
}

Используя curl -i -H "Accept: application/json" <a href="http://localhost:8080/api/teams" rel="nofollow">http://localhost:8080/api/teams</a>, я получаю [{}, {}], а с curl -i -H "Accept: application/json" <a href="http://localhost:8080/api/teams/team-1" rel="nofollow">http://localhost:8080/api/teams/team-1</a> я получаю {}. Если я помещу оператор печати в TeamRestService перед возвратом одной команды или списка команд, я ясно вижу, что все данные были установлены для экземпляров команды. По какой-то причине сериализация просто возвращает пустые объекты. Что мне нужно сделать для правильной сериализации экземпляров моей команды? Нужно ли создавать собственный формат или использовать какой-нибудь TypeHint? Если так, как бы я поступил так?

1 Ответ

2 голосов
/ 18 августа 2011

Да, я был глуп. Extraction.decompose работает только с классами дел. MongoRecord имеет метод asJValue. Использование этого в неявном defs решило проблему.

implicit def toJson(team: Team): JValue = team.asJValue

implicit def toJson(teams: Seq[Team]): JValue = teams map { _.asJValue }
...