Как можно распылить unmarshall список в параметрах запроса

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

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

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

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

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

это работает нормально, и я могу получить: localhost:8080/test?name=jo&friends=12 и получить то, что я ожидаю.

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

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

и мой звонок: localhost:8080/test?name=jo&friends=1,2

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

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

1 ответ

Первый пример работал, так как параметр '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/

Другие вопросы по тегам