वसंत में @V अमान्य एनोटेशन क्या दर्शाता है?


88

निम्नलिखित उदाहरण में, 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();        
}    

जवाबों:


63

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

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


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


37

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

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

    static class AppointmentForm {

        @NotNull @Future
        private Date date;
    }

1
मेरे पास एक समान कोड है। मैंने पैरामीटर @Validपर हटा दिया था ApplicationFormलेकिन, अभी भी सत्यापन फ़ील्ड date(जैसे सेट null) पर निकाल दिया गया था । कृपया समझाएँ।
लुपचियाज़ोएम

18

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

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

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


लेकिन, क्या मान्य है?
भतीजे

कृपया विस्तृत करें, @nephewtom आप क्या स्पष्ट करना चाहते हैं?
युरानोस

मैं JSR 303 पढ़ता हूं: बीन वैलिडेशन, beanvalidation.org/1.0/spec लेकिन फिर भी मुझे यह नहीं मिलता है कि क्या सत्यापन किया जाएगा ScriptFile scriptFile
भतीजे

इसके अंदर ScriptFile में शायद खेतों का एक गुच्छा होता है और उन खेतों में उन पर भी एनोटेशन होता है। यह वह जगह है जहाँ सत्यापन अंदर चलता है। मूल प्रश्न के आधार पर यह स्पष्ट नहीं है कि ScriptFile वर्ग के अंदर वास्तव में क्या है।
युरानोस

ठीक है धन्यवाद। क्या आप इसका उदाहरण रख सकते हैं कि यदि इसके क्षेत्र जहाँ एक स्ट्रिंग, एक इंटेगर और एक बीन है, तो क्या मान्य हो सकता है?
भतीजे

17

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


2
इसका क्या मतलब है "यह आपके लिए स्क्रिप्टफाइल को मान्य करेगा"? जांचें कि यह शून्य नहीं है, इसमें कुछ सिंटैक्स है, या कुछ सामग्री है? दूसरे शब्दों में, यह क्या और कैसे मान्य करता है? क्या उपयोगकर्ता को कुछ लागू करना चाहिए? मुझे इसके बारे में जानकारी कहां से मिल सकती है? धन्यवाद!
भतीजे

कृपया @ भतीजे के प्रश्न का उत्तर दें, यह गायब होने वाले मुख्य बिंदु के साथ मान्य करने के लिए पर्याप्त उत्तर नहीं है जो कि "किसके खिलाफ" है?
Monami

2
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        

मुझे लगता है कि यह @NotNullएनोटेशन वैध है, इसलिए यदि शर्त की आवश्यकता नहीं है।


2

मुझे लगता है कि मुझे पता है कि आपका सवाल कहां है। और चूंकि यह सवाल है कि Google के खोज मुख्य परिणामों में पॉप अप है, इसलिए मैं इस पर एक स्पष्ट उत्तर दे सकता हूं कि @Valid एनोटोट क्या करता है।

मैंने 3 परिदृश्य प्रस्तुत किए हैं कि मैंने @Valid का उपयोग कैसे किया है

नमूना:

public class Employee{
private String name;
@NotNull(message="cannot be null")
@Size(min=1, message="cannot be blank")
private String lastName;
 //Getters and Setters for both fields.
 //...
}

JSP:

...
<form:form action="processForm" modelAttribute="employee">
 <form:input type="text" path="name"/>
 <br>
 <form:input type="text" path="lastName"/>
<form:errors path="lastName"/>
<input type="submit" value="Submit"/>
</form:form>
...

परिदृश्य 1 के लिए नियंत्रक:

     @RequestMapping("processForm")
        public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
        return "employee-confirmation-page";
    }

इस परिदृश्य में, अपने फॉर्म को रिक्त अंतिम नाम फ़ील्ड के साथ जमा करने के बाद, आपको एक त्रुटि पृष्ठ मिलेगा क्योंकि आप सत्यापन नियम लागू कर रहे हैं लेकिन आप इसे जो भी संभाल रहे हैं।

उक्त त्रुटि का उदाहरण: अपवाद पृष्ठ

परिदृश्य 2 के लिए नियंत्रक:

 @RequestMapping("processForm")
    public String processFormData(@Valid @ModelAttribute("employee") Employee employee,
BindingResult bindingResult){
                return bindingResult.hasErrors() ? "employee-form" : "employee-confirmation-page";
            }

इस परिदृश्य में, आप उस सत्यापन से बाइंडिंग परिणाम तक के सभी परिणाम पास कर रहे हैं, इसलिए यह आपको तय करना है कि उस फॉर्म के सत्यापन परिणामों के साथ क्या करना है।

परिदृश्य 3 के लिए नियंत्रक:

@RequestMapping("processForm")
    public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
                return "employee-confirmation-page";
            }
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> invalidFormProcessor(MethodArgumentNotValidException ex){
  //Your mapping of the errors...etc
}

इस परिदृश्य में आप अभी भी पहले परिदृश्य की तरह त्रुटियों को नहीं संभाल रहे हैं, लेकिन आप इसे किसी अन्य विधि से पास करते हैं जो उस अपवाद का ख्याल रखेगा जो फॉर्म मॉडल को संसाधित करते समय @Valid ट्रिगर करता है। चेक इस देखो क्या मानचित्रण और जो कुछ के साथ क्या करना।

योग करने के लिए : @Valid अपने आप से ऐसा कुछ भी नहीं है जो सत्यापन के सत्यापन को प्रेरित करता है JSR 303 एनोटेट फ़ील्ड ( @NotNull, @Email, @Size, आदि ... ), आपको अभी भी क्या करना है की रणनीति निर्दिष्ट करने की आवश्यकता है कहा सत्यापन के परिणामों के साथ।

आशा है कि मैं लोगों के लिए कुछ स्पष्ट करने में सक्षम था जो इसके साथ ठोकर खा सकते हैं।


1

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


1

@Valid का एक और उपयोगी पहलू जो ऊपर उल्लेखित नहीं है, वह है (यानी: पोस्टमैन को एक समापन बिंदु का परीक्षण करने के लिए) @Valid एक गलत रीस्ट कॉल के आउटपुट को स्वरूपित JSON में बमुश्किल पठनीय पाठ के एक बूँद के बजाय प्रारूपित करेगा। यदि आप अपने उपयोगकर्ताओं के लिए व्यावसायिक रूप से उपभोग्य एपीआई बना रहे हैं तो यह बहुत उपयोगी है।


1

मैं और अधिक विवरण जोड़ना चाहता था कि कैसे @Validकाम करता है, खासकर वसंत में।

वसंत में सत्यापन के बारे में आप जो कुछ भी जानना चाहते हैं, वह स्पष्ट रूप से और https://reflectoring.io/bean-validation-with-spring-boot/ में विस्तार से बताया गया है , लेकिन मैं इस उत्तर की प्रतिलिपि @Validबनाऊंगा कि लिंक कैसे काम करता है नीचे जाता है।

@Validएनोटेशन उन्हें मान्य करने के लिए एक आराम नियंत्रक विधि में चर करने के लिए जोड़ा जा सकता है। वेरिएबल के 3 प्रकार हैं जिन्हें मान्य किया जा सकता है:

  • अनुरोध शरीर,
  • पथ के भीतर चर (जैसे आईडी / in / foos / {आईडी}) और,
  • क्वेरी पैरामीटर।

तो अब ... वसंत "कैसे मान्य करता है"? आप कुछ एनोटेशन के साथ एनोटेशन को वर्ग के क्षेत्रों में परिभाषित कर सकते हैं। उसके बाद, आप उस वर्ग के एक ऑब्जेक्ट को एक मान्य में पास करते हैं जो यह जांचता है कि क्या बाधाएं संतुष्ट हैं।

उदाहरण के लिए, मान लें कि मेरे पास नियंत्रक विधि इस तरह थी:

@RestController
class ValidateRequestBodyController {

  @PostMapping("/validateBody")
  ResponseEntity<String> validateBody(@Valid @RequestBody Input input) {
    return ResponseEntity.ok("valid");
  }

}

तो यह एक POST अनुरोध है जो एक प्रतिक्रिया निकाय में लेता है, और हम उस प्रतिसाद निकाय को एक वर्ग में मैप कर रहे हैं Input

यहाँ वर्ग है Input:

class Input {

  @Min(1)
  @Max(10)
  private int numberBetweenOneAndTen;

  @Pattern(regexp = "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$")
  private String ipAddress;
  
  // ...
}

@V अमान्य एनोटेशन वसंत को जाने और नियंत्रक में पारित डेटा को यह देखने के लिए जाँच कर बताएगा कि पूर्णांक numberBetweenOneAndTenउन मिनटों और अधिकतम एनोटेशनों के कारण 1 और 10 के बीच है। यह यह भी सुनिश्चित करने के लिए जांच करेगा कि एनोटेशन में नियमित अभिव्यक्ति से मेल खाते आईपी पते को पारित किया गया है।

साइड नोट: नियमित अभिव्यक्ति सही नहीं है .. आप 3 अंकों की संख्या में पास कर सकते हैं जो 255 से अधिक हैं और यह अभी भी नियमित अभिव्यक्ति से मेल खाएगा।


यहां क्वेरी चर और पथ चर को मान्य करने का एक उदाहरण दिया गया है:

@RestController
@Validated
class ValidateParametersController {

  @GetMapping("/validatePathVariable/{id}")
  ResponseEntity<String> validatePathVariable(
      @PathVariable("id") @Min(5) int id) {
    return ResponseEntity.ok("valid");
  }
  
  @GetMapping("/validateRequestParameter")
  ResponseEntity<String> validateRequestParameter(
      @RequestParam("param") @Min(5) int param) { 
    return ResponseEntity.ok("valid");
  }
}

इस स्थिति में, चूंकि क्वेरी चर और पथ चर सिर्फ जटिल कक्षाओं के बजाय पूर्णांक हैं, इसलिए हम @Min(5)उपयोग के बजाय पैरामीटर पर कसना एनोटेशन डालते हैं @Valid

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.