0

Play 2.1 で JSON RPC を構築しています。適切なメソッドを呼び出すために、RPC ディスパッチャはリフレクションを使用してクラス メソッド インスタンスを作成し、名前で呼び出します。

現在、RPC メソッドは次のようになっています。

  def create(obj: JsValue) = {
    val menu: Menu = Json.fromJson[Menu](obj).get
    collection.insert(menu).map( r => toDirectResult(r))
  }

  def createCustom(obj: JsValue) = {
    val menu: Menu = Json.fromJson(obj)(Menu.customFormat).get
    collection.insert(menu).map( r => toDirectResult(r))
  }

私がやりたいことは、次のように RPC メソッドを定義できるようにすることです。

  def create(menu: Menu) = {
    collection.insert(menu).map( r => toDirectResult(r))
  }

問題は、RPC ディスパッチャが実行時に、「Menus」という名前のクラスで「create」という名前のメソッドを呼び出す必要があることを認識しており、JsValue としてメソッドに渡す引数の値を持っていることです。リフレクションを通じて、RPC メソッドの引数の数とその型を確認できます。引数の型がケース クラスの場合、ケース クラスのコンパニオン オブジェクトで定義された暗黙の Formatter (または Reader) を使用して JsValue をケース クラス インスタンスに変換するにはどうすればよいですか?

createCustom メソッドについては、「魔法の」解決策がないことを認識していますが、Scala を学び始めてから、このプログラミング言語では本当に不可能なことはほとんどないことに気付きました。暗黙的ではない Formatter を指定するために、アノテーションなどを使用することは可能でしょうか?

4

2 に答える 2

0

さらに慎重に検討した結果、リフレクションは私の問題に対する適切な解決策ではないと判断しました。コンパイル時の型の安全性と適切なエラー報告がなく、デバッグが難しく、パフォーマンスにも影響します。そして、ビルド時にコードを生成するために必要なすべての情報を実際に持っています。

残念ながら、私は Play ルーターを使用できません。JSON RPC ディスパッチャーの場合、ルーティングは要求本文に依存するため、Play ルーティングでは利用できません。しかし本質的には、RPC ディスパッチャーは Play ルーターと同じことを行っています。したがって、当面は RPC ルートを手動でコーディングするだけで、問題は解決されます。将来的には、Play ルーターと同様に、ディスパッチャー コードを自動的に生成する SBT プラグインを作成する予定です。

于 2013-07-17T01:52:07.390 に答える
0

PathBinder を実装する必要があります...これはhttp://www.richard-foy.fr/blog/2012/04/09/how-to-implement-a-custom-pathbindable-with-play-2に役立つはずです/

于 2013-07-07T21:00:46.343 に答える