2013-05-25 5 views
16

例:取得より良いエラーメッセージプレイJSON APIによって生成されたエラーメッセージの種類の

scala> import play.api.libs.json._ 
import play.api.libs.json._ 

scala> Json.obj("k" -> Json.obj("m" -> 7)) 
res0: play.api.libs.json.JsObject = {"k":{"m":7}} 

scala> (res0 \ "p").as[String] 
play.api.libs.json.JsResultException: JsResultException(errors:List((,List(ValidationError(validate.error.expected.jsstring,WrappedArray()))))) 
    at play.api.libs.json.JsValue$$anonfun$2.apply(JsValue.scala:67) 
    at play.api.libs.json.JsValue$$anonfun$2.apply(JsValue.scala:67) 
    at play.api.libs.json.JsResult$class.fold(JsResult.scala:69) 
    at play.api.libs.json.JsError.fold(JsResult.scala:10) 
    at play.api.libs.json.JsValue$class.as(JsValue.scala:65) 
    at play.api.libs.json.JsUndefined.as(JsValue.scala:98) 
    at .<init>(<console>:12) 
    at .<clinit>(<console>) 
    at .<init>(<console>:7) 
    // gazillion lines more 

scala> (res0 \ "k" \ "m").as[String] 
play.api.libs.json.JsResultException: JsResultException(errors:List((,List(ValidationError(validate.error.expected.jsstring,WrappedArray()))))) 
    at play.api.libs.json.JsValue$$anonfun$2.apply(JsValue.scala:67) 
    at play.api.libs.json.JsValue$$anonfun$2.apply(JsValue.scala:67) 
    at play.api.libs.json.JsResult$class.fold(JsResult.scala:69) 
    at play.api.libs.json.JsError.fold(JsResult.scala:10) 
    at play.api.libs.json.JsValue$class.as(JsValue.scala:65) 
    at play.api.libs.json.JsNumber.as(JsValue.scala:108) 
    at .<init>(<console>:12) 
    at .<clinit>(<console>) 
    at .<init>(<console>:7) 
    // gazillion lines more 

は、このAPIのうち、優れたエラーメッセージを取得する方法はありますか?例えば、2例上記のエラーメッセージがJsValue.as[T]を使用してValue found at JsPath \ "k" \ "m" cannot be read as type Stringなど

答えて

10

yesがこのケースで堅牢ではありません、No value found at JsPath \ "p"次のようになります。その後、暗黙のReads[String]とそれに適用される

res0 \ "p"戻りJsUndefined

より良い方法の私見を直接JsPathReads使用しています); ...それは本当だが、あなたが期待していないものを「ちょっとそれは文字列ではありません」と言います

ここでは、missing-pathについてのより良いメッセージがあります。 JsErrorの最初のパラメータで欠落しているパスを通知します。

メッセージは素晴らしい文字列として、ローカルメッセージを使用してキーをマッピングできます。 ところで、これらのJsonエラーメッセージは、FormsなどPlayの他のエラーメッセージに関してはあまり標準化されていません。 Playの今後のリリースで改善すると思います。あなたがクライアントにJSONの検証エラーを送信する場合

は最後に、JsErrorでのヘルパー関数は、これは単なる機能のこの種の生のバージョンであるJsResult.recoverTotal

scala> ((__ \ "k" \ "m").read[String]).reads(res0).recoverTotal(e => JsError.toFlatJson(e)) 
res11: java.io.Serializable = {"obj.k.m":[{"msg":"validate.error.expected.jsstring","args":[]}]} 

で使用することがあります。別のフォーマットが必要な場合、私はtoFlatJsonの実装を見て、独自のものを書くことをお勧めします。

+2

はなぜJsValue' 'のデフォルトのアクセサメソッドがどのように動作するか、デフォルトの方法ではありません)。

は楽しいことがありますか?エラー報告の問題。 :( – missingfaktor

+0

@マンダビアン - 私はスカラケースクラスのプロパティの1つにロングタイプを持っていますが、私はそのクラスのseqにjsonを変換するときに "erro.expected.long"を与えます –

+0

もしそれがエラーそれは恐ろしいことではないでしょう。 – JulienD

関連する問題