被叫方法不是预期的方法

时间:2014-11-12 09:22:46

标签: scala playframework-2.0

上周,我花了很多(太多)时间来解决一个奇怪的问题。我想使用gnieh.diffson来修补现有对象,客户端使用格式良好的Json补丁发送PATCH /api/test/patch请求。然后我解析补丁并应用它:

import gnieh.diffson._ 
val patch = JsonPatch.parse(request.body.asText.getOrElse("")) 
val workspace = """{"node":{}}""" 
val result = patch(workspace) 
println(result)

此代码在简单App内正常工作,但在播放Controller时失败:

  

[error] PatchException ::元素节点不存在   “{\”node \“:{}}”(JsonPatch.scala:140)
  [错误] gnieh.diffson.Operation.action(JsonPatch.scala:140)
  [错误] gnieh.diffson.Add.action(JsonPatch.scala:174)......

解决方案是确定一切。

gnieh.diffson.JsonPatch#apply类有3个apply方法:

def apply(json : scala.Predef.String, compacted : scala.Boolean = { /* compiled code */ }) : scala.Predef.String = { /* compiled code */ } 
def apply(value : net.liftweb.json.JValue) : net.liftweb.json.JValue = { /* compiled code */ } 
def apply[T](<value : T>)(implicit evidence\$1 : scala.Predef.Manifest[T]) : T = { /* compiled code */ } 

我认为第一个被调用是因为“ workspace ”是一个 String ,但我错了。被调用的方法是最后一个,有隐含的证据。

我目前的解决方案是将工作区解析为net.liftweb.json.JValue,但我对此并不满意,因为:
  - 我无法理解为什么这是被叫的最后一种方法   - 我必须将net.liftweb.json.JValue格式化为字符串以重新创建play.api.libs.json.JsObject ..(因为我后来在我的过程中需要它)

请你解释一下为什么被叫方法更复杂?

非常感谢

1 个答案:

答案 0 :(得分:1)

合同中有一条条款废弃了使用默认args的替代方案:

http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#overloading-resolution