use*_*709 5 scala routes spray spray-dsl
我是新来的喷雾剂.我正在玩构建路由,虽然我设法使用参数指令从查询字符串中获取参数,但是当我希望其中一个参数成为列表时,我遇到了麻烦.
对于这个例子,我已经定义了这个案例类:
case class Person(name: String, friends: Int)
Run Code Online (Sandbox Code Playgroud)
我的路线目前看起来像这样:
path("test") {
get { parameters('name, 'friend ).as(Person) { p => complete(p) } }
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,我可以做一个get:localhost:8080/test?name = jo&friends = 12并得到我的期望.
我想传递朋友ID的列表,而不仅仅是朋友的数量,所以我开始更改我的案例类,如下所示:
case class Person(name: String, friends: Array[Int])
Run Code Online (Sandbox Code Playgroud)
我的电话:localhost:8080/test?name = jo&friends = 1,2
这不编译.我得到一个类型不匹配:发现:Person.type required:spray.routing.HListDeserializer [shapeless.:: [String,shapeless.:: [String,shapeless.HNil]],?] get {parameters('name,'friend) ).as(Person){p => ^ comment:这指向P in .as(Person)
关于我做错了什么的任何想法?我喜欢这个怎么做的答案.更好的是解释它正在寻找的这种无形类型.谢谢
第一个示例有效,因为参数'friend可以自动从 转换String为Int,从而满足案例类的要求Person。
后者不起作用,因为没有String => Array[Int]可用的转换,因此不可能Person从两个字符串具体化 a。
通过查看消息错误,您可以看出它将'friend和 都视为字符串'name
spray.routing.HListDeserializer[shapeless.::[String,shapeless.::[String,shapeless.HNil]],?]
Run Code Online (Sandbox Code Playgroud)
可以简化为类似的东西
String :: String :: HNil
Run Code Online (Sandbox Code Playgroud)
即它正在寻找可以将两个字符串反序列化为其他字符串的东西。
最重要的是,您需要提供一个自定义反序列化器才能解析"1,2"为Array[Int].
这是相关文档:http://spray.io/documentation/1.1-SNAPSHOT/spray-httpx/unmarshalling/#unmarshalling