2013-03-02 8 views
5

मैं एक अंतिम बिंदु इस प्रकार उत्पन्न होते हैं:रिटर्निंग त्रुटियों

public Book insertBook(Book book) { 
    PersistenceManager mgr = getPersistenceManager(); 
    try { 
     if (containsShout(book)) { 
      throw new EntityExistsException("Object already exists"); 
     } 
     mgr.makePersistent(book); 
    } finally { 
     mgr.close(); 
    } 
    return book; 
} 

मुझे आश्चर्य है कि कैसे मैं ग्राहक के लिए त्रुटियों लौटना चाहिए। ईजी। पुस्तक में कुछ आवश्यक फ़ील्ड, एक आईएसएनएम चेक इत्यादि शामिल हैं

तो मैं एक अपवाद फेंकने वाला मानता हूं लेकिन यह मानचित्र लौटा जेसन प्रतिक्रिया के लिए कैसे करता है। जेसन रेस्पसन में क्लाइंट में इन फ़ील्ड को हाइलाइट करने के लिए सभी फ़ील्ड त्रुटियां होनी चाहिए।

+0

आप इस समस्या को हल करने के लिए प्रबंधन किया था? अगर आपने यह कैसे किया? – dynamokaj

+0

नहीं, लेकिन मुझे अब दिलचस्पी नहीं है –

उत्तर

5

सामान्य अपवादों में प्रतिक्रिया में 500 http स्थिति कोड में मैप किए जाते हैं। निम्न अपवादों के साथ आप अलग अलग कोड प्राप्त कर सकते हैं: com.google.api.server.spi.response.BadRequestException -> 400 com.google.api.server.spi.response.UnauthorizedException -> 401 com.google.api.server.spi.response.ForbiddenException -> 403 com.google.api.server.spi.response.NotFoundException -> 404

आप का उपभोग एंड्रॉयड में अपने अंतिम बिंदु त्रुटि कोड IOException में हो जाएगा, तो फेंक दिया वहाँ और आप पकड़ में तदनुसार प्रतिक्रिया कर सकते हैं।

+0

हां मैं समझता हूं कि HTTP त्रुटि कोड लौट रहा है। मुझे आश्चर्य है कि डोमेन गुणों की उल्लंघन की बाधाओं जैसे विस्तृत त्रुटि संदेशों से कैसे निपटें। –

+0

यह वह व्यवहार नहीं है जिसे मैं 1.7.5 में देख रहा हूं। मैं एक BadRequestException फेंक रहा हूँ और क्लाइंट को मेरे संदेश के साथ 200 मिल रहा है जो शरीर में स्ट्रिंग को JSON के रूप में थोड़ा सा है। – Eliot

+0

मुझे यह अर्हता प्राप्त करने दें: यह locahost dev सर्वर पर काम नहीं करता है, लेकिन यह * 1.7.5 में भी ऐप इंजन सर्वर पर काम करता है। तो यह वास्तव में localhost dev सर्वर में एक बग है। – Eliot

0

मैं एक सार वर्ग इकाई होने के द्वारा ऐसा कर रहा हूं।

इसमें एक प्रतिक्रिया कोड है, जो एक enum और एक स्ट्रिंग त्रुटि संदेश है।

तो "पुस्तक" इकाई से प्राप्त हो सकती है। और आपकी प्रतिक्रिया इस तरह दिख सकती है:

public Book insertBook(Book book) { 
    PersistenceManager mgr = getPersistenceManager(); 
    try { 
     if (containsShout(book)) { 
      book.setResponseCode(ResponseCode.ERROR); 
      book.setError("Object already exists"); 
     } else { 
      mgr.makePersistent(book); 
     } 
    } finally { 
     mgr.close(); 
    } 
    return book; 
} 
+0

उत्तर @davibq के लिए धन्यवाद, लेकिन यह इकाई वर्गों इमो को प्रदूषित करता है। हो सकता है कि मुझे एकल, एंटीटीटी रेस्पॉन्स बनाना चाहिए जिसमें मॉडल, प्रतिक्रिया स्थिति और त्रुटियां हों।ध्यान दें कि मैं com.google.api.server.spi.response.CollectionResponse के लिए इसे विस्तारित कर सकता हूं और समान repsonse स्थिति और त्रुटियों सहित। –

3

मैंने ऐसा कुछ करने की कोशिश की और मेरे लिए अच्छा काम करने लग रहा था।

class Response<T> { 
    Status status; 
    String userFriendlyMessage; 
    T object; //your bean or entity object 

    RestResponse toRestResponse() { 
     RestResponse r = new RestResponse(); 
     r.status = status; 
     r.userFriendlyMessage = userFriendlyMessage; 
     r.object = object; 
    } 
} 

आप अंतराल से एक सामान्य वस्तु वापस नहीं कर सकते हैं। तो एक समकक्ष RestResponse वर्ग बनाएँ जो प्रतिक्रिया से बनाया जा सकता है।

class RestResponse { 
    Status status; 
    String userFriendlyMessage; 
    Object object; 
} 

स्थिति इस तरह हो सकती है।

public enum Status { 
    SUCCESS, RESOURCE_NOT_FOUND, RESOURCE_ALREADY_EXISTS; //etc 
} 

सभी अपने अंतिम बिंदु तरीकों RestResponse जो बारी में एक प्रतिक्रिया से निर्माण किया जाएगा वापसी होगी (टी अपने सेम या संस्था वस्तु हो सकता है)।

जब आप अपने जेसन प्रतिक्रिया (RestResponse) को deserialize करते हैं तो आप सीधे इसे प्रतिक्रिया के रूप में deserialize कर सकते हैं।

उम्मीद है कि इससे मदद मिलती है।

सादर, सत्य

+0

यह मेरे लिए काम नहीं करता है, मुझे मिलता है: "त्रुटि: ऑब्जेक्ट प्रकार टी समर्थित नहीं है।" उदाहरण: सार्वजनिक प्रतिक्रिया। रीस्ट रिस्पॉन्स getBeer() { प्रतिक्रिया जेनेरिक रीस्पॉन्स = नया प्रतिक्रिया (); \t genericResponse.status = Status.SUCCESS; genericResponse.object = नया बीयर ("कार्ल्सबर्ग"); वापसी genericResponse.toRestResponse(); } – dynamokaj

+0

@ डायनामोकज - क्या आप कृपया कुछ कोड स्निपेट पोस्ट कर सकते हैं? आप जिथब या किसी अन्य दस्तावेज़ से लिंक कर सकते हैं। – Sathya

+0

हां यहां यह है: https://gist.github.com/dynamokaj/cb0c0569311d9d15ee40 यह आपके जैसा होना चाहिए। हालांकि मैंने खेतों को निजी बना दिया है और इसे तीन फाइलों के बजाय एक फ़ाइल (ResponseDto.java) में रखा है। – dynamokaj

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