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 を指定するために、アノテーションなどを使用することは可能でしょうか?