स्प्रिंग एमवीसी के साथ, सत्यापन करने के लिए 3 अलग-अलग तरीके हैं: एनोटेशन, मैन्युअल या दोनों का मिश्रण। मान्य करने के लिए एक अद्वितीय "सबसे साफ और सबसे अच्छा तरीका" नहीं है, लेकिन शायद एक है जो आपकी परियोजना / समस्या / संदर्भ को बेहतर ढंग से फिट करता है।
चलो एक उपयोगकर्ता है:
public class User {
private String name;
...
}
विधि 1: यदि आपके पास स्प्रिंग 3.x + और करने के लिए सरल सत्यापन है, तो javax.validation.constraints
एनोटेशन (JSR-303 एनोटेशन भी कहा जाता है) का उपयोग करें।
public class User {
@NotNull
private String name;
...
}
आपको अपने पुस्तकालयों में जेएसआर -303 प्रदाता की आवश्यकता होगी, जैसे कि हाइबरनेट वैलिडेटर जो संदर्भ कार्यान्वयन है (इस लाइब्रेरी का डेटाबेस और रिलेशनल मैपिंग से कोई लेना-देना नहीं है, यह सिर्फ सत्यापन :-) करता है।
फिर आपके नियंत्रक में आपके पास कुछ इस तरह होगा:
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @Valid @ModelAttribute("user") User user, BindingResult result){
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
@Valid देखें: यदि उपयोगकर्ता के पास अशक्त नाम है, तो result.hasErrors () सही होगा।
विधि 2: यदि आपके पास जटिल सत्यापन है (जैसे बड़े व्यावसायिक सत्यापन तर्क, कई क्षेत्रों में सशर्त सत्यापन, आदि), या किसी कारण से आप विधि 1 का उपयोग नहीं कर सकते हैं, तो मैनुअल सत्यापन का उपयोग करें। नियंत्रक तर्क को मान्यता तर्क से अलग करने के लिए यह एक अच्छा अभ्यास है। खरोंच से अपना सत्यापन वर्ग (एस) न बनाएं, वसंत एक आसान org.springframework.validation.Validator
इंटरफ़ेस प्रदान करता है (वसंत 2 के बाद से)।
तो चलिए बताते हैं आपको
public class User {
private String name;
private Integer birthYear;
private User responsibleUser;
...
}
और आप कुछ "जटिल" सत्यापन करना चाहते हैं जैसे: यदि उपयोगकर्ता की आयु 18 वर्ष से कम है, तो जिम्मेदार को अशक्त नहीं होना चाहिए और जिम्मेदार की आयु 21 वर्ष से अधिक होनी चाहिए।
आप ऐसा कुछ करेंगे
public class UserValidator implements Validator {
@Override
public boolean supports(Class clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User) target;
if(user.getName() == null) {
errors.rejectValue("name", "your_error_code");
}
// do "complex" validation here
}
}
तब आपके नियंत्रक में आपके पास होगा:
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @ModelAttribute("user") User user, BindingResult result){
UserValidator userValidator = new UserValidator();
userValidator.validate(user, result);
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
यदि सत्यापन त्रुटियां हैं, तो result.hasErrors () सत्य होगा।
नोट: आप "binder.setValidator (...)" के साथ नियंत्रक के @InitBinder विधि में सत्यापनकर्ता को भी सेट कर सकते हैं (जिस स्थिति में विधि 1 और 2 का मिश्रण उपयोग संभव नहीं होगा, क्योंकि आप डिफ़ॉल्ट को प्रतिस्थापित करते हैं सत्यापनकर्ता)। या आप इसे कंट्रोलर के डिफॉल्ट कंस्ट्रक्टर में इंस्टेंट कर सकते हैं। या एक @ घटक / @ सेवा उपयोक्ता है जो आप अपने नियंत्रक में (@Autowired) इंजेक्षन करते हैं: बहुत उपयोगी है, क्योंकि अधिकांश सत्यापनकर्ता सिंगलटैन हैं + इकाई परीक्षण मॉकिंग आसान हो जाता है + आपका सत्यापनकर्ता अन्य स्प्रिंग घटकों को कॉल कर सकता है।
विधि 3:
दोनों विधियों के संयोजन का उपयोग क्यों नहीं किया जाता है? एनोटेशन के साथ "नाम" विशेषता की तरह सरल सामान को मान्य करें (यह करने के लिए त्वरित, संक्षिप्त और अधिक पठनीय है)। सत्यापनकर्ताओं के लिए भारी सत्यापन रखें (जब कस्टम जटिल सत्यापन एनोटेशन को कोड करने में घंटों लगेंगे या बस जब एनोटेशन का उपयोग करना संभव नहीं होगा)। मैंने यह एक पूर्व परियोजना पर किया था, यह एक आकर्षण, त्वरित और आसान की तरह काम करता था।
चेतावनी: आपको अपवाद हैंडलिंग के लिए सत्यापन सत्यापन में गलती नहीं करनी चाहिए । उनका उपयोग कब करना है, जानने के लिए इस पोस्ट को पढ़ें ।
संदर्भ: