2012-05-23 16 views
14

में संग्रहों को कैसे सत्यापित करें मुझे जेएसआर -303 की @Valid एनोटेशन के साथ समस्या है। annotation काम करता है सामान्य सूची या और सेट के लिए ठीक है, लेकिन मैं नक्शे जो सूचियाँ होते हैं, अर्थातमैप्स

@Valid 
HashMap<String, ArrayList<Object1>> map; 

इस मामले में मान्य करने के लिए कोशिश कर रहा हूँ, Object1 वर्ग के उदाहरण मान्य नहीं हैं। क्या इस ऑब्जेक्ट को फिर से चलाने और इसे मैन्युअल रूप से सत्यापित किए बिना, इसे फिर से करने का कोई सुविधाजनक तरीका है?

उत्तर

13

विनिर्देशन सत्यापन मान निर्दिष्ट नहीं करता है जब मानचित्र मान स्वयं सूचीबद्ध होते हैं।

JSR 303 specification से

:

इटरेटर द्वारा प्रदान की प्रत्येक वस्तु मान्य है। मानचित्र के लिए, प्रत्येक Map.Entry का मान मान्य है (कुंजी मान्य नहीं है)।

के बाद से अपने मामले में मूल्य एक सूची है, जो एक @Valid एनोटेशन नहीं है, यह कार्रवाई की नहीं होती है। इसके आस-पास पहुंचने के लिए आप या तो

सूची में एनोटेशन प्रोसेसिंग को मजबूर कर, एक और बीन में निहित सूची लपेटें।

public class ListHolder<T extends Iterable> { 
    @Valid 
    public T wrappedList; 
} 

या वैकल्पिक रूप से आप एक custom validator अपने जटिल नक्शों को संभालने के लिए लिख सकते हैं। कुछ इस तरह:

@Target({ METHOD, FIELD, ANNOTATION_TYPE }) 
@Retention(RUNTIME) 
@Documented 
@Constraint(validatedBy = ValidMapValidator.class) 
public @interface ValidMap { 
    String message() default "valid.map"; 

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

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

public class ValidMapValidator implements 
     ConstraintValidator<ValidMap, Map<?, ?>> { 

    @Override 
    public void initialize(final ValidMap annotation) { 
     return; 
    } 

    @Override 
    public boolean isValid(final Map<?, ?> map, 
     final ConstraintValidatorContext context) { 
     if (map == null || map.size() == 0) 
     return true; 

     // Iterate each map entry and validate 
     return true; 
    } 
} 
+0

हाँ, मैं एक कस्टम सत्यापनकर्ता लिखने के लिए है, लेकिन वास्तविक ऑब्जेक्ट प्रकार पता करने के लिए मैं जरूरत valiate की कोशिश की। सेट करें > बाधा उल्लंघन = validator.validate (कार); – liecno

+0

आप जेनेरिक प्रकार के लिए वाइल्डकार्ड का उपयोग कर सकते हैं। अपने सत्यापनकर्ता को सेटअप करने के तरीके के उदाहरण के लिए मेरे उत्तर में संपादन देखें। – Perception

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