2010-08-27 15 views
9

यह उदाहरण थोड़ा सा योगदान है; मैंने इसे विस्तृत विवरण निकालने और मेरी समस्या पर ध्यान केंद्रित करने के लिए सरल बना दिया है।एक सत्यापनकर्ता में सेवा को स्वचालित करना

@Component 
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> { 

    @Autowired 
    UsernameService usernameService; 

    @Override 
    public void initialize(UniqueUsername uniqueUsername) { 
    } 

    @Override 
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 
     return !usernameService.exists(s); 
    } 
} 

मैं इस तरह मेरी नियंत्रक से सत्यापनकर्ता फोन:

@RequestMapping 
public void checkUsername(Model model, User user) { 
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
    Validator validator = factory.getValidator(); 

    Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username"); 
    model.addAttribute("error", constraintViolations.size() > 0); 
} 

हालांकि, मैं एक NullPointerException अपवाद मिलती रहती है मैं एक सत्यापनकर्ता है कि इस तरह दिखता है। मैंने अपने सत्यापनकर्ता में एक ब्रेकपॉइंट जोड़ा और देखा कि usernameServicenull था। यह स्वचालित क्यों नहीं हो रहा है? शुरू में मैंने सोचा था कि ऐसा इसलिए था क्योंकि मैंने @Component के साथ सत्यापनकर्ता को एनोटेट नहीं किया था, लेकिन मुझे अभी भी यह टिप्पणी करने के बाद भी एक ही समस्या है। UsernameService कक्षा को पहले से ही @Service के साथ एनोटेट किया गया है और मैं सत्यापित कर सकता हूं कि इसके निर्माता को बुलाया जा रहा है।

मैं वसंत के लिए नया हूं, इसलिए मुझे यह भी यकीन नहीं है कि यह एक वैधता में सेवा करने के लिए ठीक है या नहीं। मैं क्या गलत कर रहा हूं?

उत्तर

11

वसंत में, आप के रूप में वर्णित in the reference, ValidatorFactory (या Validator ही) Validation.buildDefaultValidatorFactory() के बजाय LocalValidatorFactoryBean के माध्यम से प्राप्त करने के लिए की जरूरत है।

@Autowired 
Validator validator; 

@RequestMapping 
public void checkUsername(Model model, User user) { 
    Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username"); 
    model.addAttribute("error", constraintViolations.size() > 0); 
} 

-

<bean id="validator" 
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 

संपादित करें: लेकिन शायद बेहतर तरीका यह @Valid टिप्पणी के साथ वसंत MVC के स्वत: सत्यापन का उपयोग करना है क्या करना है:

@RequestMapping 
public void checkUsername(Model model, @Valid User user, BindingResult result) { 
    if (result.hasErrors()) { 
     ... 
    } 
} 

यह भी में <mvc:annotation-driven/> की आवश्यकता है कॉन्फ़िगरेशन

+0

धन्यवाद एक गुच्छा! यही वही है जो मैं ढूंढ रहा था। मैं संदर्भ दस्तावेज के माध्यम से जा रहा था, लेकिन मैं "ऑटोवॉयरिंग सेवाओं को बाधाओं" जैसी चीजों की खोज कर रहा था। एक बार फिर धन्यवाद! –

+0

मुझे @Valid के साथ संपादित करना पसंद है। इच्छा है कि मैं एक से अधिक बार ऊपर उठा सकता हूं :) –

+0

बहुत बहुत धन्यवाद, आपके उत्तर ने मुझे समय बचाने में मदद की! –

0

नया सत्यापनकर्ता बनाने के बजाय, आपको इसे ऑटोवायर करना या नियंत्रक को इंजेक्ट करना होगा। आपके सत्यापनकर्ता के रूप में इंजेक्शन नहीं होने वाली सेवा से NPE वसंत द्वारा बनाया/प्रबंधित नहीं किया जा रहा है।

+0

यदि मैं सीधे सत्यापनकर्ता को स्वचालित रूप से स्वचालित करता हूं, तो मुझे 'isvalalid 'कॉल करने के लिए' ConstraintValidatorContext' की आवश्यकता है। मैं इसे कैसे प्राप्त करूं? यह मेरे लिए थोड़ा सा झुकाव भी लगता है। क्या मैं ऐसा करने का प्रयास करने का एक बेहतर तरीका है? –