2012-07-07 8 views
10

के बजाय जेएसआर -303 सत्यापनकर्ता का उपयोग करना मेरे पास स्पष्टीकरण के लिए यहां एक बहुत ही बेवकूफ वैचारिक प्रश्न है। मेरे एप्लिकेशन में मैं वर्तमान में @NotBlank और @NotNull एनोटेशन के साथ डोमेन मॉडल मान्य JSR 303 हाइबरनेट सत्यापनकर्ता उपयोग कर रहा हूँ, उपयोगकर्ता नाम, पासवर्ड आदिस्प्रिंग वैलिडेटर

public class Admin { 

    private Long id; 
    @NotBlank(message = "Username should not be null") 
    private String username; 
    @NotBlank(message = "Username should not be null") 
    private String password; 
    ... 

जाँच की तरह लेकिन मौजूदा उपयोगकर्ता नाम की तरह डोमेन तर्क मान्य के लिए, मैं 'अभी भी वसंत के सत्यापनकर्ता इंटरफ़ेस

@Component 
public class AdminValidator implements Validator { 
    ... 
    @Override 
    public void validate(Object target, Errors errors) { 
    Admin admin = (Admin) target; 
    if (usernameAlradyExist())){ 
     errors.rejectValue("username", null, "This user already exist's in the system."); 
    } 

} 

का उपयोग कर हूँ नियंत्रक में मैं दोनों

@RequestMapping(value = "/register", method = RequestMethod.POST) 
public String register(@Valid @ModelAttribute("admin") Admin admin, BindingResult bindingResult,) { 
    validator.validate(admin, bindingResult); 
    if (bindingResult.hasErrors()) { 
     return REGISTER_ADMIN.getViewName(); 

    } 

उपयोग कर रहा हूँ क्या यह संभव है बस हाइबरनेट सत्यापनकर्ता उपयोग करने के लिए और नहीं एक डोमेन तर्क को मान्य करने के लिए सभी स्प्रिंग वैलिडेटर का उपयोग नहीं करते हैं?

उत्तर

15

हाँ, आप JSR सत्यापन अपने डोमेन तर्क सत्यापन के लिए उपयोग कर सकते हैं। आपको कस्टम बाधा एनोटेशन को परिभाषित करने और इसके अंदर अपने डोमेन तर्क सत्यापन को परिभाषित करने की आवश्यकता है।

तरह कस्टम बाधा एनोटेशन कस्टम एनोटेशन के लिए UserExistsConstraint

@Target({ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Constraint(validatedBy=UserExistsConstraintValidator.class) 

public @interface UserExistsConstraint { 
String message() default "This user already exist's in the system."; 
Class<!--?-->[] groups() default {}; 
Class<!--? extends Payload-->[] payload() default {}; 
} 

परिभाषित सत्यापनकर्ता को परिभाषित करना।

public class UserExistsConstraintValidator implements ConstraintValidator<UserExistsConstraint, object=""> { 

@Override 
public void initialize(UserExistsConstraint constraint) { 

} 

@Override 
public boolean isValid(Object target, ConstraintValidatorContext context) { 
    if (usernameAlradyExist()) 
    {  
    return false; 
    } 
    else 
    { 
    return true; 
    }  
} 
} 

कस्टम एनोटेशन

public class Admin { 

    private Long id; 
    @NotBlank(message = "Username should not be null") 
    @UserExistsConstraint 
    private String username; 
    @NotBlank(message = "Username should not be null") 
    private String password; 
    ... 
+0

धन्यवाद, यही वह है जो मैं ढूंढ रहा था :-) – tintin

+0

@ टिनटिन: खुशी है कि मैं मदद कर सकता हूं :) – xyz

2

यदि आप <mvc:annotation-driven/> के साथ स्प्रिंग एमवीसी को कॉन्फ़िगर कर रहे हैं तो यह स्वचालित रूप से JSR 303 validator को कॉन्फ़िगर करेगा यदि कुछ JSR 303 सत्यापनकर्ता इत्यादि (उदाहरण के लिए हाइबरनेट-सत्यापनकर्ता) क्लासपाथ में मौजूद है।

या यदि आप स्पष्ट रूप से सत्यापनकर्ता कॉन्फ़िगर करना चाहते हैं, तो आप ऐसा कर सकते हैं:

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

यह फिर से एक JSR 303 कार्यान्वयन के लिए देखने के लिए और का उपयोग करें कि सत्यापनकर्ता के रूप में होगा।

आप इसे डिफ़ॉल्ट एक वैश्विक सत्यापनकर्ता इस तरह से पंजीकरण से किसी भी @Valid प्रपत्र वस्तु मान्य करने के लिए कर सकते हैं:

<mvc:annotation-driven validator="validator"/> 
+1

मुझे लगता है कि ओपी कैसे JSR में व्यापार तर्क सत्यापन लागू करने के लिए है कि हम वसंत सत्यापन में परिभाषित के लिए पूछ का उपयोग करना। जेएसआर -303 में कस्टम एनोटेशन को परिभाषित करने के बारे में आईएमएचओ, जबकि आपका उत्तर जेएसआर सत्यापन को कॉन्फ़िगर करने और उपयोग करने के बारे में बात करता है। अगर मैं कोई गलत धारणा कर रहा हूं तो कृपया मुझे सही करें। – xyz

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