2012-02-13 18 views
6

में सशर्त सत्यापन मेरे पास एक ऐसा फॉर्म है जिसमें radio बटन और check-boxes शामिल हैं। जब भी उपयोगकर्ता radio button या check-box का चयन/चयन रद्द करता है तो कुछ अन्य इनपुट फ़ील्ड सक्षम/अक्षम होते हैं।
मैं केवल उन फ़ील्ड के लिए सत्यापन जोड़ना चाहता हूं जो उपयोगकर्ता फ़ॉर्म सबमिट करते समय सक्षम हैं। जमा करने के समय अक्षम किए गए फ़ील्ड को सत्यापन के लिए नहीं माना जाना चाहिए।वसंत

मैं इसे क्लाइंट साइड सत्यापन में जोड़ना नहीं चाहता हूं। क्या सत्यापनकर्ता में एकाधिक if जोड़ने के बजाय स्प्रिंग 3.0 में सशर्त सत्यापन लागू करने का कोई बेहतर/आसान तरीका है?

धन्यवाद!

उत्तर

3

जब खेतों अक्षम हैं वे स्थानांतरित कर रहे हैं (BTW:

@Inject javax.validation.Validator validator 

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

<bean id="validator" 
     class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
     <property name="validationMessageSource" ref="messageSource" /> 
</bean> 

: स्प्रिंग 3.0 समाधान के लिए, यह भी संभव स्प्रिंग सत्यापनकर्ता इंजेक्षन जाने के लिए है) null के रूप में नियंत्रक के लिए। मैं एक सत्यापन जोड़ना चाहता था जो null i.e अक्षम फ़ील्ड या not blank फ़ील्ड i.e. सक्षम लेकिन खाली फ़ील्ड को अनुमति देगा।
इसलिए मैंने एक कस्टम एनोटेशन NotBlankOrNull बनाया जो null और गैर खाली तारों को भी रिक्त स्थान की देखभाल करने की अनुमति देगा।
यहाँ मेरी व्याख्या

@Documented 
@Constraint(validatedBy = { NotBlankOrNullValidator.class }) 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface NotBlankOrNull { 
    String message() default "{org.hibernate.validator.constraints.NotBlankOrNull.message}"; 

    Class<?>[] groups() default { }; 

    Class<? extends Payload>[] payload() default { }; 
} 

सत्यापनकर्ता वर्ग

public class NotBlankOrNullValidator implements ConstraintValidator<NotBlankOrNull, String> { 

    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 
     if (s == null) { 
      return true; 
     } 
     return s.trim().length() > 0; 
    } 

    @Override 
    public void initialize(NotBlankOrNull constraint) { 

    } 
} 

मैं अपने site बारे में अधिक जानकारी को अद्यतन किया है।

8

यदि आप जेएसआर 303 बीन सत्यापन का उपयोग करते हैं तो आप validation groups (groups) का उपयोग कर सकते हैं।

मान लें कि आपके पास यह उपयोगकर्ता इनपुट है, जिसमें दो अनुभाग हैं। दो बूलियन इंगित करते हैं कि अनुभाग सक्षम या अक्षम हैं या नहीं। (बेशक आप @NotNull की तुलना में अधिक उपयोगी व्याख्या का उपयोग कर सकते हैं)

public class UserInput { 
    boolean sectionAEnabled; 
    boolean sectionBEnabled; 

    @NotNull(groups=SectionA.class) 
    String someSectionAInput; 

    @NotNull(groups=SectionA.class) 
    String someOtherSectionAInput; 

    @NotNull(groups=SectionB.class) 
    String someSectionBInput; 

    Getter and Setter 
} 

आप समूहों के लिए दो इंटरफेस की जरूरत है। वे केवल मार्कर के रूप में काम करते हैं।

public interface SectionA{} 

public interface SectionB{} 

Since Spring 3.1 आप सत्यापन को गति प्रदान करने के लिए अपने नियंत्रक विधि में स्प्रिंग @Validated एनोटेशन (@Validate के बजाय) का उपयोग कर सकते हैं:

@RequestMapping... 
public void controllerMethod(
     @Validated({SectionGroupA.class}) UserInput userInput, 
     BindingResult binding, ...){...} 

स्प्रिंग 3.1 इससे पहले कि निर्दिष्ट करने के लिए कोई रास्ता नहीं था प्रमाणीकरण समूह जिसे सत्यापन के लिए उपयोग किया जाना चाहिए (क्योंकि @Validated मौजूद नहीं है और @Validate में कोई समूह विशेषता नहीं है), इसलिए आपको हेक्टेयर द्वारा सत्यापन शुरू करना होगा एन लिखित कोड: यह एक उदाहरण है कि स्प्रिंग 3.0 में चुड़ैल अनुभाग पर निर्भरता में सत्यापन को ट्रिगर कैसे किया जाए।

@RequestMapping... 
public void controllerMethod(UserInput userInput,...){ 

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
    Validator validator = factory.getValidator(); 

    List<Class<?>> groups = new ArrayList<Class<?>>(); 
    groups.add(javax.validation.groups.Default.class); //Always validate default 
    if (userInput.isSectionAEnabled) { 
    groups.add(SectionA.class); 
    } 
    if (userInput.isSectionBEnabled) { 
    groups.add(SectionB.class); 
    } 
    Set<ConstraintViolation<UserInput>> validationResult = 
    validator.validate(userInput, groups.toArray(new Class[0])); 

    if(validationResult.isEmpty()) { 
    ... 
    } else { 
    ... 
    } 
} 

+0

वास्तव में एक अच्छा सुझाव की तरह दिखता है। बस यह सोचकर कि डीटीओ में मौजूद क्षेत्रों में इसे कैसे लागू किया जाए। मेरे पास कुछ फ़ील्ड हैं जो बीन/डोमेन objecct में मौजूद नहीं हैं लेकिन डीटीओ पर मौजूद हैं और मैं उनके लिए भी सत्यापन जोड़ना चाहता हूं। – xyz

+0

आप इस javax.validation anntoation (NotNull, ...) को बहुत कक्षा, एंटिटी डीटीओ, के क्षेत्रों पर डाल सकते हैं ... ऊपर दिए गए उदाहरण में, UserInput एक डीटीओ होना चाहिए – Ralph