2012-04-26 24 views
7

में रीस्टफुल डिलीट को कैसे संभालें I स्प्रिंग एमवीसी नियंत्रक में रीस्टफुल डिलीट का सही तरीके से उपयोग कैसे करें? मेरे पास डीएओ है जो कुछ आइटम हटाने की कोशिश करते समय बूलियन लौटाता है।स्प्रिंग एमवीसी

मैं आइटम को हटाने का प्रयास कर रहा हूं। अगर सबकुछ ठीक था, तो बस आइटमों की सूची दिखाएं (हटाए गए आइटम अब और नहीं होंगे)। अगर आइटम को हटाया नहीं जा सकता है, तो विवरण पृष्ठ पर रीडायरेक्ट करें और कहें कि इसे क्यों हटाया नहीं जा सका।

क्या मुझे कुछ विशेष प्रतिक्रिया स्थिति या ऐसा कुछ चाहिए? क्या मेरा दृष्टिकोण सही है?

@RequestMapping(value = "items/{id}", method = RequestMethod.DELETE) 
public String delete(@PathVariable("id") int itemId, Model model) { 
    Item item = itemDao.get(id); 

    // true -> can delete 
    // false -> cannot delete, f.e. is FK reference somewhere 
    boolean wasOk = itemDao.delete(item); 

    if (wasOk) { 
     return "redirect:/items"; 
    } 

    // will write to user which item couldn't be deleted 
    model.addAttribute("item", item); 
    return "items/error"; 
} 

उत्तर

10

यदि आप किसी डिलीट वाले मुद्दों को उपयोगकर्ता द्वारा तय किया जा सकता है, तो यह ठीक लगता है। यदि उपयोगकर्ता कुछ भी नहीं कर सकता है तो शायद एक त्रुटि कोड स्थिति अधिक सही होगी। एकमात्र विफलता जिसे मैं हटाने के लिए कल्पना कर सकता हूं वह एक प्राधिकरण विफलता होगी, जो एक 401 होगी। इसे आपकी विधि 'HttpServletResponse प्रतिक्रिया' में पैरामीटर जोड़कर सेट किया जा सकता है। आपका कोड कुछ ऐसा हो जाएगा:

@RequestMapping(value = "items/{id}", method = RequestMethod.DELETE) 
public String delete(@PathVariable("id") int itemId, Model model, HttpServletReponse response) { 
    Item item = itemDao.get(id); 

    // true -> can delete 
    // false -> cannot delete, f.e. is FK reference somewhere 
    boolean wasOk = itemDao.delete(item); 

    if (!wasOk) { 
     // will write to user which item couldn't be deleted 
     response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
     model.addAttribute("item", item); 
     return "items/error"; 
    } 

    return "redirect:/items"; 
} 

आप अन्य स्थिति कोड को उपयुक्त के रूप में प्रतिस्थापित कर सकते हैं, लेकिन यह सामान्य विचार है।

तुम भी कुछ ऐसा कर सकता है:

if (!wasOk) { 
     throw new DataAccessException("Unable to delete item: " + item); 
    } 

और फिर एक ही कक्षा में व्याख्या किए गए त्रुटि हैंडलर है

@ExceptionHandler(DataAccessException.class) 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
public String handleDataAccessException(DataAccessException ex) { 
    // Do some stuff 
    return "errorView"; 
} 
+0

ठीक है, लेकिन जब मैं ऐसा करता हूं, तो मैं "त्रुटि दृश्य" के रूप में हल किए गए पृष्ठ पर उपलब्ध होने के लिए मॉडल में सामान कैसे लगा सकता हूं? अपवाद फेंकने से पहले मैंने "model.addAttribute (" badItem ", item)" ... "लेकिन यह errorView.jsp पेज – Xorty

+0

पर उपलब्ध नहीं है, आप एक नया मॉडल और दृश्य (" त्रुटि दृश्य "," badItem ", ex .getItem()) 'नियंत्रक से, मानते हुए कि आपके पास एक कस्टम अपवाद था जो आइटम का संदर्भ रख सकता था। हालांकि यह थोड़ा गन्दा लगता है। – Kodi

+0

ये संभवतः एटीएम करने के लिए सबसे अच्छी बात है – Xorty

15

आप HTTP status codes उपयोग करने के लिए इंगित करने के लिए किया जाए या नहीं हटाने आपरेशन रीडायरेक्ट बजाय सफल होता है पर विचार करना चाहिए। उदाहरण के लिए HTTP 200 OK (या HTTP 204 No Content) यह इंगित करने के लिए कि ऑपरेशन सफल था, और HTTP 404 Not Found यदि आप जिस संसाधन को एक्सेस करने का प्रयास कर रहे हैं, वह मौजूद नहीं है, HTTP 405 Method Not Allowed यदि डिलीट ऑपरेशन की अनुमति नहीं है, आदि। प्रतिक्रिया स्थिति के आधार पर, ग्राहक निर्णय ले सकता है संदर्भित संसाधन रखना है या नहीं (आपके मामले में ऑब्जेक्ट जिसे item/{id} द्वारा संदर्भित किया गया है)।

चूंकि आप वसंत का उपयोग कर रहे हैं, तो आप अपने नियंत्रक विधियों को उपयुक्त @ResponseStatus के साथ एनोटेट कर सकते हैं, उदा। @ResponseStatus(value = HttpStatus.NO_CONTENT)

इसके अतिरिक्त, वसंत HandlerExceptionResolver पहले से ही default द्वारा कुछ स्टेटस कोड प्रदान करता है।

+0

ठीक है चलो कहते हैं कि मैं HTTP405 का उपयोग करने के बाद से संसाधन हटाया नहीं जा सकता चाहते हैं। मैं उपयोगकर्ता को कैसे बता सकता हूं कि कौन सी इकाई को हटाया नहीं जा सका? क्या मैं इसे मॉडल में रख सकता हूं और जेएसपी पेज की तुलना में मॉडल में ऐसी संपत्ति की कोशिश कर सकता हूं? – Xorty

+0

यह दूसरी तरफ है। * क्लाइंट * संसाधन की आईडी भेजता है, 'आइटम/{आईडी}', जिसे वह हटाना चाहता है, मेरा अपडेट देखें। – matsev

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