5

我是新来喷的。我正在尝试构建路由,虽然我设法使用参数指令从查询字符串中获取参数,但当我希望其中一个参数成为列表时遇到了麻烦。

对于这个例子,我定义了这个案例类:

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

我的路线目前看起来像这样:

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

这工作正常,我可以做一个 get: localhost:8080/test?name=jo&friends=12 并得到我所期望的。

我想传递朋友 id 的列表,而不仅仅是朋友的数量,所以我首先改变了我的案例类,如下所示:

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

我打电话给: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 => ^ 注释:this 指向 .as(Person) 中的 P

知道我做错了什么吗?我很想知道如何做到这一点。更好的是解释它正在寻找的这种无形类型是什么。谢谢

4

1 回答 1

4

第一个示例有效,因为参数'friend可以自动转换StringInt,因此满足Person案例类的要求。

后者不起作用,因为没有String => Array[Int]可用的转换,因此不可能Person从两个字符串中实现 a。

您可以通过查看消息错误来判断它同时将'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

于 2014-09-29T23:51:44.643 回答