2010-08-29 8 views
36

निम्नलिखित उदाहरण में, ScriptFile पैरामीटर @Valid एनोटेशन के साथ चिह्नित है।स्प्रिंग में @ वालिड एनोटेशन क्या इंगित करता है?

@Valid एनोटेशन क्या करता है?

@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)  
public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {  
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");   
    if (result.hasErrors()) {   
     modelMap.addAttribute("scriptFile", scriptFile);    
     modelMap.addAttribute("showcases", ShowCase.findAllShowCases());    
     return "scriptfile/create";    
    }   
    scriptFile.persist();   
    return "redirect:/scriptfile/" + scriptFile.getId();   
}  

उत्तर

26

यह सत्यापन उद्देश्यों के लिए है।

प्रमाणीकरण उपयोगकर्ता इनपुट को बाध्य करने के बाद मॉडल को मान्य करना आम है। स्प्रिंग 3 जेएसआर -303 के साथ घोषणात्मक सत्यापन के लिए समर्थन प्रदान करता है। यह समर्थन स्वचालित रूप से सक्षम है यदि कोई JSR-303 प्रदाता, जैसे हाइबरनेट वैलिडेटर, पर आपके क्लासपाथ पर मौजूद है। सक्षम होने पर, आप द्वारा ट्रिगर सत्यापन बस @Valid टिप्पणी के साथ एक नियंत्रक विधि पैरामीटर व्याख्या कर सकते हैं: भेजे पोस्ट मापदंडों बंधन के बाद, AppointmentForm मान्य किया जाएगा; इस मामले में, सत्यापित करने के लिए दिनांक फ़ील्ड मान शून्य नहीं है और भविष्य में होता है।


अधिक जानकारी के लिए यहाँ देखो:
http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/

8

IIRC @Valid एक स्प्रिंग एनोटेशन लेकिन एक JSR-303 एनोटेशन (जो बीन मान्यता मानक है) नहीं है। यह क्या करता है यह मूल रूप से जांचता है कि यदि आप विधि में भेजे गए डेटा को मान्य है या नहीं (यह आपके लिए स्क्रिप्टफ़ाइल मान्य करेगा)।

1

बस उपर्युक्त उत्तर में जोड़ना, एक वेब अनुप्रयोग में @valid का उपयोग किया जाता है जहां बीन को सत्यापित किया जाना चाहिए सत्यापन सत्यापन एनोटेशन के साथ भी एनोटेटेड है। @NotNull, @Email (हाइबरनेट एनोटेशन) ताकि उपयोगकर्ता से इनपुट प्राप्त करते समय मूल्यों को सत्यापित किया जा सके और बाध्यकारी परिणाम में सत्यापन परिणाम होंगे। bindingResult.hasErrors() बताएगा कि कोई सत्यापन विफल हुआ है या नहीं।

5

उपर्युक्त उत्तरों को जोड़कर, निम्नलिखित पर एक नज़र डालें। नियुक्ति फॉर्म की तारीख कॉलम दो एनोटेशन के साथ एनोटेटेड है। @Valid एनोटेशन होने से अपॉइंटमेंटफॉर्म (इस मामले में @NotNull और @Future) पर सत्यापन ट्रिगर करता है। ये एनोटेशन विभिन्न जेएसआर -303 प्रदाताओं (उदाहरण के लिए, हाइबरनेट, स्प्रिंग..एटीसी) से आ सकते हैं।

@RequestMapping(value = "/appointments", method = RequestMethod.POST) 
    public String add(@Valid AppointmentForm form, BindingResult result) { 
     .... 
    } 

    static class AppointmentForm { 

     @NotNull @Future 
     private Date date; 
    } 
1
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {  
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");   

मुझे लगता है कि इस @NotNull एनोटेशन इसलिए मान्य है अगर हालत की जरूरत नहीं है।

3

@Valid में वसंत के साथ कुछ भी नहीं है। यह बीन सत्यापन विनिर्देश का हिस्सा है (उनमें से कई हैं, नवीनतम संस्करण 2017 के दूसरे छमाही के रूप में जेएसआर 380 है), लेकिन @Valid बहुत पुराना है और जेएसआर 303 से सभी तरह से प्राप्त होता है।

जैसा कि हम सभी जानते हैं, सामान्य रूप से सभी अलग-अलग जेएसआर और जावा पुस्तकालयों (जेपीए, जेटीए, कैशिंग इत्यादि के बारे में सोचें) के साथ एकीकरण प्रदान करने में वसंत बहुत अच्छा है और निश्चित रूप से उन लोगों ने भी सत्यापन की देखभाल की। यह महत्वपूर्ण घटक है जो इसे सुविधाजनक बनाता है MethodValidationPostProcessor है।

अपने प्रश्न का उत्तर देने का प्रयास कर रहे हैं - @Valid एक जटिल ग्राफ को मान्य करना चाहते हैं, न कि किसी ऑब्जेक्ट के केवल शीर्ष-स्तर वाले तत्वों को मान्य करना चाहते हैं, इसलिए तथाकथित सत्यापन कैस्केडिंग के लिए बहुत आसान है। हर बार जब आप गहरी जाना चाहते हैं, तो आपको @Valid का उपयोग करना होगा। यही जेएसआर निर्देशित करता है। वसंत कुछ मामूली विचलन के साथ इसका पालन करेगा (उदाहरण के लिए मैंने को @Valid के बजाय RestController विधि और सत्यापन कार्यों पर डालने का प्रयास किया, लेकिन यह नियमित "सेवा" सेम के लिए लागू नहीं होगा)।