2011-04-07 14 views
5

सत्यापनकर्ता वर्ग में अनुरोध ऑब्जेक्ट कैसे प्राप्त करें, क्योंकि मुझे अनुरोध ऑब्जेक्ट में मौजूद पैरामीटर यानी पैरामीटर को सत्यापित करने की आवश्यकता है।स्प्रिंग एमवीसी

उत्तर

1

नहीं 100% यकीन है कि मैं सही ढंग से अपने प्रश्न अनुसरण कर रहा हूँ, लेकिन वसंत MVC के साथ, आप वस्तु विधि में है, इसलिए जैसे गुजरती हैं और उस पर टिप्पणी (कम से कम स्प्रिंग 3 के साथ):

@RequestMethod(value = "/accounts/new", method = RequestMethod.POST) 
public String postAccount(@ModelAttribute @Valid Account account, BindingResult result) { 
    if (result.hasErrors()) { 
     return "accounts/accountForm"; 
    } 

    accountDao.save(account); 
} 

यहां प्रासंगिक एनोटेशन @ वालिद है, जो जेएसआर -303 का हिस्सा है। BindingResult param को भी शामिल करें ताकि आपके ऊपर उपरोक्त वर्णित त्रुटियों की जांच करने का कोई तरीका हो।

4

सरल सत्यापनकर्ता (आपका कस्टम सत्यापनकर्ता) का उपयोग करके आपको वैलिडेटर में परम प्राप्त करने के लिए अनुरोध ऑब्जेक्ट की आवश्यकता नहीं है। आप इसे सीधे से प्राप्त कर सकते हैं।

उदाहरण के लिए: यह नाम name और age

public class PersonValidator implements Validator { 

    /** 
    * This Validator validates just Person instances 
    */ 
    public boolean supports(Class clazz) { 
     return Person.class.equals(clazz); 
    } 

    public void validate(Object obj, Errors e) { 
     ValidationUtils.rejectIfEmpty(e, "name", "name.empty"); 
     Person p = (Person) obj; 
     if (p.getAge() < 0) { 
      e.rejectValue("age", "negativevalue"); 
     } else if (p.getAge() > 110) { 
      e.rejectValue("age", "too.darn.old"); 
     } 
    } 
} 

साथ अनुरोध से क्षेत्र की जाँच करेगा भी देखें

9

आपके पास दो विकल्प:

  • JSR 303 (बीन मान्यकरण) प्रमाणकों
  • स्प्रिंग प्रमाणकों

लिए JSR 303 आप स्प्रिंग 3.0 की जरूरत है और JSR 303 एनोटेशन के साथ अपने मॉडल वर्ग पर टिप्पणी करना चाहिए, और एक लिखने @ वेब नियंत्रक हैंडलर विधि में पैरामीटर के सामने मान्य। (जैसे Willie Wheeler show in his answer)। Additionaly आप विन्यास में इस कार्यक्षमता सक्षम करना होगा:

<!-- JSR-303 support will be detected on classpath and enabled automatically --> 
<mvc:annotation-driven/> 

लिए स्प्रिंग प्रमाणकों, आप अपने सत्यापनकर्ता (Jigar Joshi's answer देखें) कि org.springframework.validation.Validator इंटरफ़ेस लागू करता है लिखने के लिए की जरूरत है। आपको नियंत्रक में अपना वैलिडेटर पंजीकृत करना होगा। स्प्रिंग 3.0 में आप

Example (from the spring docu) 
@Controller 
public class MyController { 

    @InitBinder 
    protected void initBinder(WebDataBinder binder) { 
     binder.setValidator(new FooValidator()); 
    } 

    @RequestMapping("/foo", method=RequestMethod.POST) 
    public void processFoo(@Valid Foo foo) { ... } 
} 

अधिक जानकारी के लिए (यह सुपर वर्ग DataBinder की एक विधि है setValidator) WebDataBinder.setValidator का उपयोग करके एक @InitBinder एनोटेट विधि, में ऐसा कर सकते हैं, स्प्रिंग संदर्भ, अध्याय 5.7.4 Spring MVC 3 Validation पर एक नजर है ।

बीटीडब्ल्यू: स्प्रिंग 2 में सरलफॉर्म नियंत्रक में setValidator संपत्ति की तरह कुछ समय था।

+0

वसंत सत्यापनकर्ता स्थापना छुपाता सत्यापन सुविधा हाइबरनेट (JSR 303)। हाइबरनेट सत्यापन और अतिरिक्त उपयोग अपने वसंत वैधता का उपयोग करने का कोई तरीका है? – Saram

+0

@ साराम: मैं वसंत वैधताओं के बजाय जेएसआर 303 का उपयोग करने की दृढ़ता से अनुशंसा करता हूं। - अगर आप कुछ पूछना चाहते हैं तो वैसे भी एक नया प्रश्न पोस्ट करें। – Ralph

+0

आप सत्यापनकर्ता दृष्टिकोण दोनों को गठबंधन करने के लिए 'binder.addValidator (नया FooValidator()) का उपयोग कर सकते हैं। – shadowhorst

0

आप आसानी से HttpServletRequest पैरामीटर के साथ एक और विधि जोड़ सकते हैं।

public void validateReq(Object target, Errors errors,HttpServletRequest request) { 

     // do your validation here 
} 

ध्यान दें कि आप एक विधि यहाँ

0

अधिभावी नहीं कर रहे हैं जब मैं वसंत सत्यापनकर्ता सत्यापित करें कैप्चा का उपयोग मैं भी यही समस्या है। सत्यापनकर्ता कार्यान्वयनकर्ता में, मैं HttpSession से सही-कैप्चा प्राप्त करना चाहता हूं (HttpServletRequest से HttpSession प्राप्त करें)।

इसे वैधकर्ता में प्राप्त करने के लिए कोई अच्छा कोड नहीं मिला, इतना बुरा !!!

  1. बाध्यकारी रूप में डीटीओ एक अतिरिक्त क्षेत्र (फोन: correctCaptcha) जोड़ें:

    पालन कुछ समझौता प्रस्ताव कर रहे हैं, नियंत्रक विधि में HttpSession से क्षेत्र मूल्य निर्धारित करते हैं, तो आप में मान्य कर सकते हैं सत्यापनकर्ता

    public class UserRegisterDto { 
        private String correctCaptcha; 
        //getter,setter 
    } 
    
  2. बाध्यकारी रूप डीटीओ में HttpServletRequest संदर्भ जोड़ कर सत्यापनकर्ता में इसका इस्तेमाल कर सकते हैं।

    public class UserRegisterDto { 
        private HttpServletRequest request; 
        //getter ,setter 
    } 
    
    @RequestMapping(value = "register.hb", method = RequestMethod.POST) 
    public String submitRegister(@ModelAttribute("formDto") @Valid UserRegisterDto formDto, HttpServletRequest request,BindingResult result) { 
        formDto.setRequest(request); 
        if (result.hasErrors()) { 
         return "user_register"; 
        } 
    } 
    
+0

क्षमा करें, यह काम नहीं है, शायद स्प्रिंग एमवीसी इंटरसेप्टर का उपयोग एक अच्छा समाधान है – monkeyk

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