2010-12-12 10 views
10

के साथ विधि पैरामीटर प्रमाणीकरण क्या JSR-303 विधि पैरामीटर सत्यापन के लिए भी है?जेएसआर -303

यदि हां, तो क्या वेब पर कोई उदाहरण है? मुझे सबसे बड़ी चुनौती का सामना करना पड़ रहा है यह है कि प्रत्येक विधि के भीतर एक वैधकर्ता कैसे प्राप्त करें। स्प्रिंग 3 के साथ, इसका मतलब यह नहीं है कि मुझे LocalValidatorFactoryBean के साथ लगभग हर कक्षा को इंजेक्ट करना होगा?

धन्यवाद!

उत्तर

3

यह एओपी (AspectJ) के उपयोग के मामले की तरह लगता है। javax.validation.constraints.* के साथ एनोटेटेड विधियों के लिए पॉइंटकट लिखें, पहलू (शायद वसंत का उपयोग करके) में एक वैधकर्ता इंजेक्ट करें और विधि निष्पादन से पहले सत्यापन करने के लिए @Before या @Around सलाह का उपयोग करें।

संदर्भ के लिए AspectJ in Action पढ़ें।

3

javadocs JSR 303 एनोटेशन से प्रत्येक के लिए निम्नलिखित बताता है:

@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}) 

देखें, PARAMETER है। तो, हाँ, यह तकनीकी रूप से संभव है।

public void method(@NotNull String parameter) { 
    // ... 
} 

मैं हालांकि लगता है कि कैसे स्प्रिंग के साथ एकीकृत के बाद से मैं उसका उपयोग नहीं करते नहीं कर रहा हूँ:

यहाँ एक उदाहरण है। आप इसे आज़मा सकते हैं।

9

जेएसआर 303 के संदर्भ कार्यान्वयन Hibernate Validator के आगामी संस्करण 4.2 में विधि स्तर सत्यापन समर्थित होगा।

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

ध्यान दें कि एचवी केवल विधि कॉल की वास्तविक सत्यापन के साथ सौदा करेगा, न कि इस तरह के सत्यापन को ट्रिगर करने के साथ। एओपी या जेडीके की गतिशील प्रॉक्सी जैसी अन्य विधि अवरोध सुविधाओं का उपयोग करके सत्यापन आमंत्रण किया जा सकता है।

इसके लिए जेआईआरए मुद्दा एचवी -347 [1] है, इसलिए आप खुद को इस मुद्दे पर वॉचर के रूप में जोड़ना चाहेंगे।

[1] http://opensource.atlassian.com/projects/hibernate/browse/HV-347

+0

मैं अपने ब्लॉग पोस्ट अपने जवाब पूरक लगता है;) http://musingsofaprogrammingaddict.blogspot.com/2011/01/method-validation-with-h ibernate.html – Maxym

+0

गुन्नर [गिटहब] में अपना समाधान डालने के लिए काफी अच्छा था (https://github.com/gunnarmorling/methodvalidation- एकीकरण)। मेरे लिए बहुत अच्छा काम किया। – Patrick

0
jcabi-aspects

आप उपयोग कर सकते हैं, जो AspectJ साथ JSR 303 एकीकृत (मैं एक डेवलपर हूँ)। वास्तविक सत्यापन जेएसआर 303 कार्यान्वयन में से एक द्वारा किया जाता है, जिसे आपको कक्षा पथ में जोड़ना होगा, जैसे हाइबरनेट वैलिडेटर, या अपाचे बीवाल।

2

वसंत 3.1.0 में आप एक pojo पर सत्यापन सक्रिय करने के लिए @ सत्यापित मान्यता का उपयोग कर सकते हैं। pojo क्लास के लिए एक इंटरफेस बनाएं, इस पर इस एनोटेशन को डालें, फिर विधियों की परिभाषाओं में अपनी सत्यापन एनोटेशन जोड़ें।(इंटरफेस की आवश्यकता है क्योंकि वसंत परिभाषा के रूप में इंटरफ़ेस का उपयोग कर एक प्रॉक्सी वर्ग पैदा करेगा)

@Validated 
public interface PojoClass { 
    public @NotNull String doSomething(@NotEmpty String input); 
} 

अपने POJO:,

public class PojoClassImpl implements PojoClass { 
    public String doSomething(String input) { 
     return ""; 
    } 
} 

सक्रिय मान्यता के साथ एक मानक वसंत वेब अनुप्रयोग से शुरू में डालने की बात याद अपने वसंत विन्यास इस सेम घोषणा:

<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/> 
+0

कुछ अजीब कारणों के लिए ConstraintViolationException सार्वजनिक \ @NotNull स्ट्रिंग doSomething(); काम नहीं किया लेकिन \ @NotNull सार्वजनिक स्ट्रिंग doSomething(); किया। एसओ द्वारा उपयोगकर्ता के साथ उलझन में प्रतीक पर भागने के लिए बार का उपयोग किया – borjab

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