2013-05-25 2 views
16

प्ले JSON एपीआई द्वारा उत्पादित त्रुटि संदेशों में से तरह के उदाहरण:प्ले JSON एपीआई से बेहतर त्रुटि संदेश हो रही

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 

वहाँ एक रास्ता इस एपीआई से बाहर बेहतर त्रुटि संदेश प्राप्त करने के लिए है? उदाहरण के लिए, दो मामलों से ऊपर के लिए त्रुटि संदेश No value found at JsPath \ "p" की तरह लग सकता है, Value found at JsPath \ "k" \ "m" cannot be read as type String आदि

उत्तर

10

JsValue.as[T] का उपयोग कर हाँ इस मामले में मजबूत नहीं है:

res0 \ "p" रिटर्न JsUndefined जो तब एक अंतर्निहित Reads[String] और इसे करने के लिए लागू किया जाता है कहते हैं ... यही सच है, लेकिन आप क्या उम्मीद नहीं "हे कि एक स्ट्रिंग नहीं है";)

बेहतर तरीका IMHO ReadsJsPath सीधे पर उपयोग करता है:

scala> ((__ \ "p").read[String]).reads(res0) 
res7: play.api.libs.json.JsResult[String] = JsError(List((/p,List(ValidationError(validate.error.missing-path,WrappedArray()))))) 

scala> ((__ \ "k" \ "m").read[String]).reads(res0) 
res8: play.api.libs.json.JsResult[String] = JsError(List((/k/m,List(ValidationError(validate.error.expected.jsstring,WrappedArray()))))) 

यहां आपके पास गायब-पथ के बारे में एक बेहतर संदेश है। यह जेएसईरर में पहले पैरा में लापता पथ को भी सूचित करता है।

संदेशों को अच्छे स्ट्रिंग के रूप में देखते हुए, आप कुंजी को मैप करने के लिए स्थानीय संदेश का उपयोग कर सकते हैं। बीटीडब्ल्यू, उन जेसन त्रुटियों के संदेश को फॉर्म जैसे अन्य त्रुटि संदेशों के संबंध में काफी मानकीकृत नहीं किया गया है। मुझे लगता है कि हम इसे भविष्य की रिलीज में सुधारेंगे।

अंत में, जब आप ग्राहक के लिए 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":[]}]} 

यह सिर्फ समारोह के इस प्रकार के एक कच्चे संस्करण है उपयोग करने के लिए है। यदि आपको किसी अन्य प्रारूप की आवश्यकता है, तो मैं फ्लैटजसन कार्यान्वयन को देखने और अपना खुद का लिखने की सलाह देता हूं।

मज़े;)

+2

क्यों डिफ़ॉल्ट तरीका कैसे 'JsValue' पर डिफ़ॉल्ट एक्सेसर तरीके काम नहीं है? मामलों की रिपोर्ट करने में त्रुटि। :( – missingfaktor

+0

@ मंडुबियन - मेरे पास स्कैला केस क्लास की संपत्ति में से एक में लंबा प्रकार है। लेकिन जब मैं उस वर्ग के जेसन को सीक में परिवर्तित करता हूं तो यह मुझे "erro.expected.long" –

+0

देता है अगर यह भी बताता है कि कौन सी रेखा त्रुटि है ऐसा होता है कि यह * भयानक नहीं होगा। – JulienD

संबंधित मुद्दे