2011-06-10 14 views
8

संभव डुप्लिकेट:
using Hibernate Validator without calling annotation.प्रोग्रामेटिक बीन मान्यता (JSR 303) एनोटेशन बिना

मैं इस समग्र बाधा एनोटेशन (केवल व्याख्या के लिए) है:

@Target... @Retention... 
@Constraint(validatedBy = {}) 
@Pattern(regexp = PasswordComplexity.AT_LEAST_TWO_NONE_ALPAH_CHARS) 
@Length(min = 6, max = 20) 
public @interface PasswordComplexity { 
    ...  
} 

और मैं इसे वसंत नियंत्रकों और इकाई वर्गों में उपयोग करता हूं।

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

public void createUser(UserDto userDto, String password) { 
    if(hasViolation(validator.validate(password,PasswordComplexity.class))) { 
    throw new PasswordComplexityViolationException(); 
    } else { 
    … 
    } 
} 

लेकिन मैं एक नहीं एनोटेट सरल वस्तु (स्ट्रिंग) के लिए JSR 303 सत्यापनकर्ता को चलाने के लिए कैसे पता नहीं है। क्या यह कम से कम संभव है, और कैसे?

(मैं JSR 303 प्रदाता के रूप में हाइबरनेट सत्यापनकर्ता का उपयोग करें)

+0

मैं 'सच्चाई के एकल स्रोत' से समझता हूं, जिसका अर्थ है कि आप अपनी एनोटेशन दोहराना नहीं चाहते हैं जो शायद आपके 'उपयोगकर्ता' वर्ग में 'पासवर्ड' संपत्ति/फ़ील्ड पर रखा गया है, है ना? लेकिन आपके "कुछ ऐसा" उदाहरण में आप कम से कम एनोटेशन ('passwordComplexity') का नाम दोहराते हैं। क्या यह भी एक अनावश्यकता नहीं है? –

+0

@Grzegorz Oledzki: किसी भी समस्या को अलग-अलग स्थानों में एनोटेशन का उपयोग नहीं करना है। 'सच्चाई के एकल स्रोत' के साथ मेरा मतलब है कि मैं वही चीजें (लंबाई और पैटर्न) परिभाषा को फिर से लिखने के बजाय एनोटेशन का उपयोग करना चाहता हूं। – Ralph

+0

@abalogh: प्रश्न एक डुप्लिकेट है (मैंने इसे ओवरलैक्ड किया है), लेकिन स्वीकार्य उत्तर प्रश्न से मेल नहीं खाता - या कम से कम मेरा प्रश्न नहीं। – Ralph

उत्तर

2

एक तरह से करते हैं यह एक पूर्ण कस्टम सत्यापनकर्ता लिखना होगा, और एनोटेशन सिर्फ सत्यापनकर्ता का उपयोग कर रहा है कि कक्षा में नीचे तर्क पुश करने के लिए। इसका मतलब यह होगा कि तब आपके पास एक स्वतंत्र संकलन इकाई थी (एक पूर्ण श्रेणी PasswordComplexityValidator implements implements ConstraintValidator<PasswordComplexity, String> ...) जिसे आप एनोटेशन से स्वतंत्र रूप से उपयोग कर सकते हैं। यह दृष्टिकोण आपके लिए सत्यापन की जांच करने के लिए इकाई को आसान बनाता है।

हालांकि, चूंकि आप एनबर्नेट द्वारा प्रदान किए गए मौजूदा रेगेक्स सत्यापनकर्ता को कॉन्फ़िगर करने के तरीके के रूप में एनोटेशन का उपयोग कर रहे हैं, तो आप इसे एनोटेशन क्लास से निरंतर पैटर्न पास करने के बजाय उस का उपयोग कर सकते हैं। आपको अपनी लंबाई को रेगेक्स में भी बाध्य करने में सक्षम होना चाहिए, जो कि दोनों एनोटेशन होने की तुलना में सरल और तेज़ होगा।

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