2013-11-08 3 views
3

Я создаю backend API с Play Framework и Scala. Я хотел бы отобразить входящий запрос на объект scala. Одна из переменных экземпляра объекта - это список каналов. Вот то, что я в настоящее время:Список JSON для списка Scala

метод контроллера, который принимает запрос и пытается сопоставить его пользователю:

def addUser = Action(parse.json) { request => 
    request.body.validate[User].fold({ errors => 
    BadRequest(Json.obj(
     "status" -> "Error", 
     "message" -> "Bad JSON", 
     "details" -> JsError.toFlatJson(errors) 
    )) 
    }, { user => 
    User.create(user.pushToken, user.channels) 
    Ok(Json.obj("status" -> "OK", "message" -> "User created")) 
    }) 
} 

Пользователь случай класса: форматировочной

case class User(id: Pk[Long], pushToken: String, channels: List[String]) 

Пользователь:

implicit val userFormat = (
    (__ \ "id").formatNullable[Long] and 
    (__ \ "pushToken").format[String] and 
    (__ \ "channels").format[List[String]] 
)((id, pushToken, channels) => User(id.map(Id(_)).getOrElse(NotAssigned), pushToken, channels), 
    (u: User) => (u.id.toOption, u.pushToken, u.channels)) 

Метод создания аннормации пользователя:

def create(pushToken: String, channels: List[String]) { 
    DB.withConnection { implicit c => 
    SQL("insert into user (pushToken, channels) values ({pushToken}, {channels})").on(
     'pushToken -> pushToken, 
     'channels -> channels 
    ).executeUpdate() 
    } 
} 

Когда я пытаюсь скомпилировать, я получаю:

Compilation error[could not find implicit value for parameter extractor: anorm.Column[List[String]]] 

В идеале, я хотел бы быть в состоянии принять это как пользователь:

{ 
    "pushToken":"4jkf-fdsja93-fjdska34", 
    "channels": [ 
    "channelA", "channelB", "channelC" 
    ] 
} 

и создать пользователя от него ,

+0

Какие СУБД? Как выглядит ваша схема? Сообщение об ошибке говорит, что анормальная игра не знает, как отобразить список в поле базы данных, я думаю. –

+0

@RobinGreen Я все еще очень рано в процессе разработки для этого и использую встроенную базу данных по умолчанию. Думаю, это тоже будет частью моего вопроса. Должен ли я иметь другую таблицу базы данных, которая отображает каналы для пользователей? В Play 1 я мог бы просто сделать поле базы данных байтовым массивом, а JPA отобразит остальное для меня. – eliot

+0

Да, я бы сказал, вам понадобится отдельная таблица для сопоставлений каналов для пользователей. Если вы хотите сохранить его в байтовом массиве, вам, вероятно, придется изменить '(__ \" channels "). Format [List [String]]'. –

ответ

-1

Вы не можете использовать List [String] в качестве значения столбца в Anorm, вот проблема

Вы должны использовать метод mkString или SMTH еще

Смежные вопросы