5

スプレー初心者です。ルートの構築をいじっており、パラメーター ディレクティブを使用してクエリ文字列からパラメーターを取得することはできますが、パラメーターの 1 つをリストにしたい場合に問題が発生します。

この例では、次のケース クラスを定義しました。

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

これはコンパイルされません。タイプの不一致が発生します: found : Person.type required: Spray.routing.HListDeserializer[shapeless.::[String,shapeless.::[String,shapeless.HNil]],?] get { parameters('name, 'friend ).as(Person) { p => ^ コメント: これは .as(Person) の P を指します

私が間違っていることについて何か考えはありますか?やり方の回答をいただければ幸いです。さらに良いのは、探しているこの形のないタイプが何であるかについての説明です。ありがとう

4

1 に答える 1

4

最初の例は、パラメータ'friendが から に自動的に変換されString、ケース クラスIntの要件を満たしているため機能しました。Person

利用可能な変換がないため、後者は機能しませんString => Array[Int]。そのため、2 つの文字列から a を具体化することは不可能Personです。

メッセージ エラーを見ると、 と の両方を文字列として'friend扱っていることがわかります。'name

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

次のように簡略化できます

String :: String :: HNil

つまり、2 つの文字列を別のものに逆シリアル化できるものを探しています。

要するに、に解析するには、カスタム デシリアライザーを提供する必要があり"1,2"ますArray[Int]

関連ドキュメントは次のとおりです。http://spray.io/documentation/1.1-SNAPSHOT/spray-httpx/unmarshalling/#unmarshalling

于 2014-09-29T23:51:44.643 に答える