2011-12-22 15 views
9

का उपयोग कर स्प्रिंग सत्यापन बनाम हाइबरनेट सत्यापन मैं वसंत एमवीसी 3.0 का उपयोग कर डेमो एप्लिकेशन बना रहा हूं। मुझे स्क्रीन पर सत्यापन लागू करना है। मैं नेट पर खोज करता हूं और पाया कि मुख्य रूप से 2 प्रकार के सत्यापन का उपयोग किया जाता है आवेदन: -एनोटेशन

  1. स्प्रिंग सत्यापन का उपयोग कर सत्यापन एपीआई
  2. हाइबरनेट का उपयोग कर मान्यता हाइबरनेट सत्यापन

उम्मीद है कि किसी ने मुझसे सुझाव जो एक आवेदन में लागू करने के लिए अच्छा है दे।

उत्तर

9

मैंने दोनों का उपयोग किया - मुझे हाइबरनेट प्रमाणीकरण अधिक पसंद है - लागू करने के लिए बहुत आसान और सुंदर मानक। जब आप क्लासपाथ पर कार्यान्वयन करते हैं तो यह स्वचालित रूप से सक्षम होता है। यहां एक उदाहरण दिया गया है:

@EmailValidator 
@NotBlank 
@Length(max=65) 
private String email; 

संदेश त्रुटि स्ट्रिंग कहां से आता है? वेब-INF में आप एक फ़ाइल बुलाया messages.properties होना चाहिए:

NotBlank.ForgotPasswordBackingObject.email=Email address must be present 

वहाँ एक मानक @Email एनोटेशन है, लेकिन इस तरह के रूप में एक ईमेल: मुझे @ mycompany वैध माना जाता है, यही वजह है कि मैं करना था मेरी अपने @EmailValidator (मानक कार्यान्वयन में * से + से एक regex ध्वज बदल दिया)। कुछ मुद्दों है कि मैं भर में आया हैं: सत्यापन के आदेश - जो मान्यता आप पहली बार होने के लिए, इस मान्यता समूहों के साथ किया जाता है चाहता हूँ, लेकिन यह नहीं उदाहरण के लिए, @Valid टिप्पणी के साथ संभव हो रहे हैं:

@RequestMapping(method=RequestMethod.POST, value="/auth/changePassword") 
public ModelAndView submitChangePasswordPage(@Valid @ModelAttribute("ChangePasswordBackingObject") ChangePasswordBackingObject backingObject, BindingResult result, Principal principal) 

यही कारण है कि यदि आपके पास इस फॉर्म में आपका कंट्रोलर है (उदाहरण के लिए स्प्रिंग एमवीसी में), तो आपको अपने तर्क को एक तरह से अनुकरण करना होगा - मैंने यह भी किया है।

एक और अच्छी बात यह है कि आप इसे समय में दो या अधिक क्षेत्रों को मान्य करने के लिए (मैं बहुत उपयोगी पाया है) कर सकते हैं:

@FieldMatch.List({ 
    @FieldMatch(firstValue = "password" , secondValue = "confirmPassword") 
}) 
public class RequestAccountBackingObject implements Serializable { 
    private String password; 
    private String confirmPassword; 

और कार्यान्वयन:

@Target({TYPE, ANNOTATION_TYPE}) 
@Retention(RUNTIME) 
@Constraint(validatedBy = FieldMatchImpl.class) 
@Documented 
public @interface FieldMatch{ 
    String message() default "{com.errorMessage}"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
    String firstValue(); 
    String secondValue(); 
    @Target({TYPE, ANNOTATION_TYPE}) 
    @Retention(RUNTIME) 
    @Documented 
    @interface List 
    { FieldMatch[] value(); } 
} 

अन्य FieldMatchImpl होगा:

public class FieldMatchImpl implements ConstraintValidator<FieldMatch, Object>{ 
    private String firstFieldName; 
    private String secondFieldName; 

और आपको दो विधियों को लागू करने की आवश्यकता है:

public void initialize(final FieldMatch constraintAnnotation){ 
    firstFieldName = constraintAnnotation.firstValue(); 
    secondFieldName = constraintAnnotation.secondValue(); 
इसके अलावा

:

public boolean isValid(final Object value, final ConstraintValidatorContext context){ 

    final String firstObj = BeanUtils.getProperty(value, firstFieldName); 
    final String secondObj = BeanUtils.getProperty(value, secondFieldName); 

org.apache.commons.beanutils.BeanUtils का उपयोग करके आप अब दो क्षेत्रों को मान्य कर सकते हैं।

इस तरह

:

boolean result = firstObj.equals(secondObj); 
if(!result) { 
    context.disableDefaultConstraintViolation(); 
    context.buildConstraintViolationWithTemplate(errorMessage).addNode(firstFieldName).addConstraintViolation(); 
} 

तो अन्य है कि यह अब तक हाइबरनेट मान्यता का उपयोग कर एक खुशी की गई है।

+0

एक अच्छी समझ देने के लिए धन्यवाद यूजीन, अन्य सत्यापन के बारे में क्या ..? – Anshul

+0

मेरी इच्छा है कि मैं आपके लिए एक उत्तर दे सकता हूं, लेकिन यह लंबे समय से रहा है क्योंकि मैंने स्प्रिंग सत्यापन का उपयोग किया था।:(और चूंकि जेएसआर 303 विनिर्देश बन गया है और हाइबरनेट वैलिडेटर संदर्भ कार्यान्वयन मैं वास्तव में सोचता हूं कि वसंत खुद को उसी दिशा में बदल देगा। – Eugene