वसंत में @Valid और @ अमान्य के बीच अंतर


107

स्प्रिंग दो अलग-अलग सत्यापन विधियों का समर्थन करता है: स्प्रिंग सत्यापन और जेएसआर -303 सेम सत्यापन। दोनों का उपयोग एक वसंत सत्यापनकर्ता को परिभाषित करके किया जा सकता है जो बीन सत्यापनकर्ता सहित अन्य प्रतिनिधियों को सौंपता है। अब तक सब ठीक है।

लेकिन जब वास्तव में सत्यापन का अनुरोध करने के तरीकों की व्याख्या करते हैं, तो यह एक और कहानी है। मैं इस तरह से एनोटेट कर सकता हूं

@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Valid @RequestBody TestObject obj, BindingResult result) {

या इस तरह

@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Validated @RequestBody TestObject obj, BindingResult result) {

इधर, @Valid है javax.validation.Valid , और @Validated है org.springframework.validation.annotation.Validated । बाद के लिए डॉक्स कहते हैं

जेएसआर -303 के मान्य के वेरिएंट, सत्यापन समूहों के विनिर्देश का समर्थन करते हैं। स्प्रिंग के JSR-303 समर्थन के साथ सुविधाजनक उपयोग के लिए डिज़ाइन किया गया, लेकिन JSR-303 विशिष्ट नहीं।

जो बहुत मदद नहीं करता है क्योंकि यह बिल्कुल नहीं बताता है कि यह कैसे अलग है। अगर सब पर। लगता है दोनों मेरे लिए बहुत अच्छा काम कर रहे हैं।


2
यह दिलचस्प हो सकता है: stackoverflow.com/questions/18911154/…
Wim Deblauwe

4
"सत्यापन समूहों के विनिर्देश का समर्थन करना" एक बहुत स्पष्ट कथन है।
एक बेहतर ओलिवर

मुझे यह सोचना चाहिए कि Valid कसकर JSR 303 सत्यापन (NotNull, आदि) के साथ युग्मित है। जबकि आप अन्य सत्यापन / समूह बना सकते हैं और उन्हें मान्य किया जा सकता है।
अतुल

@zeroflagL, सच है, लेकिन जब से मैंने इसका इस्तेमाल नहीं किया है, मैंने इस बिंदु को याद किया और "नहीं JSR-303 विशिष्ट" भाग के बजाय इसे ठीक किया। अब यह स्पष्ट है।
सर्गेई टैचेनोव

जवाबों:


83

जैसा कि आपने प्रलेखन से उद्धृत किया है, @Validated"सत्यापन समूहों" का समर्थन करने के लिए जोड़ा गया था, अर्थात मान्य सेम में फ़ील्ड्स का समूह। यह बहु चरण रूपों में उपयोग किया जा सकता है जहाँ आप पहले चरण में नाम, ईमेल, आदि को मान्य कर सकते हैं और फिर निम्नलिखित चरण (ओं) में अन्य क्षेत्रों में।

इस कारण को @Validएनोटेशन में नहीं जोड़ा गया , क्योंकि यह जावा समुदाय प्रक्रिया (JSR-303) का उपयोग करके मानकीकृत है, जिसमें समय लगता है और स्प्रिंग डेवलपर्स लोगों को इस कार्यक्षमता का उपयोग करने की अनुमति देना चाहते थे।

इस जीरा टिकट पर जाकर देखें कि एनोटेशन अस्तित्व में कैसे आया।


113

एक और सीधे आगे जवाब। उन लोगों के लिए जो अभी भी नहीं जानते कि पृथ्वी पर "सत्यापन समूह" क्या है

@Validसत्यापन के लिए उपयोग

नियंत्रक:

@RequestMapping(value = "createAccount")
public String stepOne(@Valid Account account) {...}

फॉर्म ऑब्जेक्ट:

public class Account {

    @NotBlank
    private String username;

    @Email
    @NotBlank
    private String email;

}

@Validatedसत्यापन समूह
स्रोत के लिए उपयोग : http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html

नियंत्रक:

@RequestMapping(value = "stepOne")
public String stepOne(@Validated(Account.ValidationStepOne.class) Account account) {...}

@RequestMapping(value = "stepTwo")
public String stepTwo(@Validated(Account.ValidationStepTwo.class) Account account) {...}

फॉर्म ऑब्जेक्ट:

public class Account {

    @NotBlank(groups = {ValidationStepOne.class})
    private String username;

    @Email(groups = {ValidationStepOne.class})
    @NotBlank(groups = {ValidationStepOne.class})
    private String email;

    @NotBlank(groups = {ValidationStepTwo.class})
    @StrongPassword(groups = {ValidationStepTwo.class})
    private String password;

    @NotBlank(groups = {ValidationStepTwo.class})
    private String confirmedPassword;

}

धन्यवाद @ Zhuhang.jasper बड़ी सरलता के साथ विस्तार से समझाने के लिए।
गौतम त्यागी

यह वही है जो मैं पिछले 2 घंटों से खोज रहा था, धन्यवाद @ ज़ुहांग.जस्पर
हुसैन

साभार @zhuhang इस के लिए देख रहे हैं
विष्णु दहेटोंडे

4

प्रश्न के उदाहरण कोड स्निपेट में, @Validऔर @Validatedकोई फर्क नहीं पड़ता। लेकिन अगर @RequestBodyकिसी Listऑब्जेक्ट के साथ एनोटेट किया गया है, या एक स्ट्रिंग वैल्यू एनोटेट है @RequestParam, तो सत्यापन प्रभावी नहीं होगा।

हम @Validatedइसे बनाने के लिए विधि-स्तरीय सत्यापन क्षमता का उपयोग कर सकते हैं । इसे प्राप्त करने के लिए, मुख्य बिंदु @Validatedवर्ग पर रखना है । यह @Validऔर @Validatedवसंत ढांचे के बीच एक और महत्वपूर्ण अंतर हो सकता है ।

refrence


क्या आप बता सकते हैं कि एनोटेशन का Listवस्तुओं के लिए कोई प्रभाव क्यों नहीं है ? मुझे लगता है कि यह भी अन्य संग्रह की तरह काम नहीं करेगा Map? हो सकता है कि आप मुझे अपने प्रश्न में अधिक विस्तृत विवरण दे सकें: stackoverflow.com/questions/60167961/…
Theiaz

1
@ Theiaz जैसा आप चाहते हैं
लेबेका

1

उपरोक्त के अलावा, आप केवल @Validनेस्टेड सत्यापन के लिए डोमेन / फ़ील्ड पर आवेदन कर सकते हैं , ए के साथ नहीं @validated

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