我正在 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 后,我发现用这种编程语言几乎没有什么是真正不可能的。是否可以使用注释或类似的东西来指定非隐式的格式化程序?