2014-07-17 11 views
5

मैं एक वसंत MVC बाकी सेवा बीन मान्यकरण 1.2 का उपयोग कर निम्न विधि के साथ बनाया है से निपटने बुलाया।स्प्रिंग बीन मान्यता @Valid

ValidObject बीन में परिभाषित संदेश कैसे प्राप्त किया जा सकता है? क्या मुझे कुछ फ़िल्टर या इंटरसेप्टर का उपयोग करना चाहिए?

मुझे पता है कि मैं, नीचे की तरह फिर से लिखने इंजेक्शन Validator से ConstraintViolation रों के सेट प्राप्त करने के लिए कर सकते हैं, लेकिन इसके बाद के संस्करण अधिक साफ लगता है ...

@RequestMapping(value = "/valid") 
public String validatedMethod(ValidObject object) { 
    Set<ConstraintViolation<ValidObject>> constraintViolations = validator 
      .validate(object); 
    if (constraintViolations.isEmpty()) { 
     return "valid"; 
    } else { 
     final StringBuilder message = new StringBuilder(); 
     constraintViolations.forEach((action) -> { 
      message.append(action.getPropertyPath()); 
      message.append(": "); 
      message.append(action.getMessage()); 
     }); 
     return message.toString(); 
    } 
} 

उत्तर

4

इस

@RequestMapping(value = "/valid") 
public String validatedMethod(@Valid ValidObject object, BindingResult result) { 
    StringBuilder builder = new StringBuilder(); 
    List<FieldError> errors = bindingResult.getFieldErrors(); 
    for (FieldError error : errors) { 
     builder.append(error.getField() + " : " + error.getDefaultMessage()); 
    } 
    return builder.toString(); 
} 
+0

चीयर्स, एक आकर्षण की तरह काम करता है :) हालांकि, अच्छा होगा, हर मान्य विधि के लिए ऐसा करने के लिए नहीं। – Dormouse

+0

@Dormouse मेरा जवाब जांचें :) – dharam

12

प्रयास करें मेरा मानना ​​है कि ऐसा करने का एक बेहतर तरीका ExceptionHandler का उपयोग कर रहा है।

अपने Controller में आप विभिन्न अपवादों को संभालने के लिए ExceptionHandler लिख सकते हैं।

@ExceptionHandler(MethodArgumentNotValidException.class) 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
@ResponseBody 
public ValidationFailureResponse validationError(MethodArgumentNotValidException ex) { 
    BindingResult result = ex.getBindingResult(); 
    final List<FieldError> fieldErrors = result.getFieldErrors(); 

    return new ValidationFailureResponse((FieldError[])(fieldErrors.toArray(new FieldError[fieldErrors.size()]))); 
} 

जब आप नियंत्रक करने के लिए एक बुरी अनुरोध भेजने, सत्यापनकर्ता प्रकार MethodArgumentNotValidException की एक अपवाद फेंकता है: नीचे उसी के लिए कोड है। तो इस अपवाद को विशेष रूप से संभालने के लिए आदर्श तरीका एक अपवाद हैंडलर लिखना होगा।

वहां आप गलत चीजों के उपयोगकर्ता को बताने के लिए एक सुंदर प्रतिक्रिया बना सकते हैं। मैं इसे वकील करता हूं, क्योंकि आपको इसे सिर्फ एक बार लिखना है और कई Controller विधियां इसका उपयोग कर सकती हैं। :)

अद्यतन

आप Controller में एक विधि तर्क के लिए @Valid एनोटेशन का उपयोग करते हैं, सत्यापनकर्ता स्वतः शुरू हो जाती है और यह वस्तु को मान्य करने की कोशिश करता है, अगर वस्तु अमान्य है, यह MethodArgumentNotValidException फेंकता ।

यदि इस अपवाद के लिए वसंत ExceptionHandler विधि पाता है तो यह इस विधि के अंदर कोड निष्पादित करेगा।

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

अब एक और मामला है जब आपके पास एकाधिक Controller एस हैं जहां आप विधि तर्क मान्य करना चाहते हैं। इस मामले में मैं आपको ExceptionResolver कक्षा बनाने और इस विधि को वहां रखने का सुझाव देता हूं। अपने Controller को इस कक्षा का विस्तार करें और आपका काम पूरा हो गया है।

+0

ठीक है, यह DRY लगता है। क्या आप थोड़ा और विस्तार कर सकते हैं? मैं इसे अपने 'मान्य विधि' से कैसे तारूं? ओह, और विधि में एक नाम की कमी है। – Dormouse

+0

आपको इसकी आवश्यकता नहीं है। मेरा अपडेट देखें। – dharam

+0

'प्रमाणीकरण विफलता रिपोर्ट' मेरी किसी भी निर्भरता में नहीं है, और Google को नहीं लगता कि यह अस्तित्व में है। मैं कौन सा मेवेन निर्भरता जोड़ सकता हूं? – Dormouse

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