1

Lift を使用して Rest サービスを実行しようとしていますが、json 本体を渡そうとすると問題が発生します。

モデル:

case class TestData(substore:String) {}

object TestData {  
  private implicit val formats = net.liftweb.json.DefaultFormats

  implicit def toJson(item: TestData): JValue = Extraction.decompose(item)

  def apply(in: JValue): Box[TestData] = Helpers.tryo{in.extract[TestData]}

  def unapply(in: Any): Option[TestData] = in match {
    case i: TestData => Some(TestData(i.substore)
    case _ => None
  }
}

休み:

object RestExample extends RestHelper {
  serve {
    case "api" :: "user" :: AsLong(id) :: Nil JsonGet _ => JInt(id)
    case "api" :: "test2" :: Nil JsonPut _ => TestData("testeee"): JValue
    case "api" :: "test" :: Nil JsonPut TestData(testData) -> _ => testData : JValue
  }
}

シンプルな put テストは次のように機能します。

curl -i -H "Content-Type: application/json" -X PUT http://localhost:8080/api/test2

しかし、json本体が機能しているテストを取得できません:

curl -i -H "Content-Type: application/json" -X PUT -d '{"substore":"abs"}' http://localhost:8080/api/test

この場合、私は常に受け取ります:

<html> <body>The Requested URL /api/test was not found on this server</body> </html> 
4

1 に答える 1

1

パターンマッチングの問題のようです。

あなたの問題TestData(testData)JObject(JField("substore", JString(substore)))解決しますか?substore: Stringこのようなパターン マッチングのスコープに含まれます。

また、TestDataオブジェクトで、なぜAny代わりに? を使用するのJValueですか? そして、どこでメソッドが呼び出されるのでしょうか。apply使用法はわかりません(どこでもTestData呼び出されませんJValue)。

于 2013-06-04T14:15:07.820 に答える