2014-09-29 1 views
5

Я новичок в спрее. Я играю вокруг с построением маршрутов, и пока мне удается получить параметры из строки запроса с помощью директивы параметров, у меня возникают проблемы, когда я хочу, чтобы один из параметров был списком.Как можно распылить unmarshall список в параметрах запроса

Для этого примера я определил этот случай класс:

case class Person(name: String, friends: Int) 

мой маршрут в настоящее время выглядит следующим образом:

path("test") { 
    get { parameters('name, 'friend).as(Person) { p => complete(p) } } 
} 

это работает отлично, и я могу сделать ПОЛУЧАЕТЕ: локальный: 8080/test? name = jo & friends = 12 и получить то, что я ожидаю.

Я хочу, чтобы передать список друзьям идентификаторов, а не только количества друзей, так что я начал, изменяя мой случай класс следующим образом:

case class Person(name: String, friends: Array[Int]) 

и мой призыв к: локальному хосту: 8080/теста ? name = jo & друзья = 1,2

это не скомпилировано. Я получаю несоответствие типа: найдено: Person.type требуется: spray.routing.HListDeserializer [shapeless. :: [String, shapeless. :: [String, shapeless.HNil]],] get {parameters ('name , 'friend) .as (Person) {p => ^ комментарий: это указывает на P в .as (Person)

Любая идея о том, что я делаю неправильно? Мне бы хотелось получить ответ о том, как это сделать. Еще лучше будет объяснение того, что этот бесформенный тип, который он ищет. Благодаря

ответ

4

Первый пример работает с параметром 'friend может быть автоматически преобразован из String в Int, следовательно, удовлетворяющие требованиям класса Person случае.

Последнее не работает, потому что нет String => Array[Int] конверсии, поэтому невозможно материализовать Person из двух строк.

Вы можете сказать, что это лечение как 'friend и 'name как строки, глядя на сообщение об ошибке,

spray.routing.HListDeserializer[shapeless.::[String,shapeless.::[String,shapeless.HNil]],?] 

может быть упрощена, что-то вроде

String :: String :: HNil 

т.е. он ищет то, что может десериализации две строки во что-то другое.

Нижняя линия, вам необходимо предоставить собственный десериализатор, чтобы разобрать "1,2" в Array[Int].

См. Соответствующую документацию: http://spray.io/documentation/1.1-SNAPSHOT/spray-httpx/unmarshalling/#unmarshalling

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