2015-03-25 5 views
6

मैं एक JSON REST API स्केला के साथ खेलने के ढांचे v2.3 के साथ बनाया गया सर्वर है, और मैं उदाहरण के लिए इस तरह नियंत्रक की कार्रवाई है:प्ले फ्रेमवर्क 2.x में JsError.toFlatJson या JsError.toJson से त्रुटि संदेश पठनीयता में सुधार कैसे करें?

def register = Action.async(BodyParsers.parse.json) { implicit request => 
     request.body.validate[Register].fold(
     errors => Future.successful(BadRequest(JsError.toFlatJson(errors))), 
     register => { 
      // do something here if no error... 
      } 
    ) 
    } 

सादगी के लिए, मैं JsError.toFlatJson (नोट के साथ सत्यापन त्रुटि संभाल: JsError.toFlatJson नए प्ले में बहिष्कृत है, प्रतिस्थापन JsError.toJson है)।

समस्या json परिणाम की तरह गुप्त संदेश है:

{"obj.person.email":[{"msg":"error.email","args":[]}]}

json से ऊपर इंगित करता है व्यक्ति का ईमेल अमान्य है।

क्या त्रुटि जेसन परिणाम को और अधिक पठनीय संदेश में परिवर्तित करने का कोई तरीका है?

मैं नहीं चाहता कि क्लाइंट ऐप्स को obj.person.email या error.email का मैपिंग/रूपांतरण करना चाहिए। मैं सर्वर को क्लाइंट ऐप्स पर जेसन लौटने से पहले करता हूं। आपकी समस्या का

उत्तर

0

भाग अपने वर्ग 'ReadsorElse साथ Combinator में कस्टम त्रुटियों संदेशों को परिभाषित द्वारा हल किया जा कर सकते हैं:

case Point(x: Int, y: Int) 

object Point { 
    implicit val pointReads: Reads[Point] = (
     (__ \ "x").read[Int].orElse(Reads(_ => JsError("Could not parse given x value."))) 
     (__ \ "y").read[Int].orElse(Reads(_ => JsError("Could not parse given y value."))) 
    )(Point.apply _) 
} 

इस वर्ग तुम अब मान्यता की समस्याओं के लिए कस्टम त्रुटि संदेश मिल जाएगा के लिए कुछ अमान्य JSON को देखते हुए :

scala> val incorrectJson = Json.parse("""{"y": 1}""") 
incorrectJson: play.api.libs.json.JsValue = {"y":1} 

scala> val validationResult = incorrectJson.validate[Point] 
validationResult: play.api.libs.json.JsResult[playground.Point] = JsError(List((/x,List(ValidationError(List(Could not read the point's x value.),WrappedArray()))))) 

scala> validationResult.fold(error => { println(JsError.toJson(error)) }, a => { a }) 
{"obj.x":[{"msg":["Could not read the point's x value."],"args":[]}]} 

आदेश obj.x पहचानकर्ता को बदलने के लिए आप पोस्ट-प्रक्रिया करना होगा लौटे JsValue खुद क्योंकि यह JsPath के कार्यान्वयन से प्राप्त है ।

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