2009-12-10 12 views
19

मैं स्प्रिंग एमवीसी ढांचे के तहत validators लिखने का प्रयास कर रहा हूं, लेकिन दस्तावेज़ीकरण में एक चमकदार चूक है। Errors ऑब्जेक्ट में त्रुटि को गुजरने पर कॉल करने पर अधिकांश विधियों में त्रुटि कोड नामक स्ट्रिंग पैरामीटर की अपेक्षा होती है। ये त्रुटि कोड, यदि मैं सही त्रुटि संदेशों के लिए सही ढंग से समझता हूं तो समझता हूं। लेकिन मैं जीवन के लिए यह नहीं समझ सकता कि इन कोडों को मैप किया गया है।स्प्रिंग एमवीसी सत्यापन त्रुटि कोड कहां हल किए गए हैं?

यहाँ मैं वसंत MVC के जावाडोक से की चर्चा करते हुए कर रहा हूँ का एक उदाहरण है;

public class UserLoginValidator implements Validator { 

    private static final int MINIMUM_PASSWORD_LENGTH = 6; 

    public boolean supports(Class clazz) { 
     return UserLogin.class.isAssignableFrom(clazz); 
    } 

    public void validate(Object target, Errors errors) { 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "field.required"); 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "field.required"); 
     UserLogin login = (UserLogin) target; 
     if (login.getPassword() != null 
      && login.getPassword().trim().length() < MINIMUM_PASSWORD_LENGTH) { 
      errors.rejectValue("password", "field.min.length", 
       new Object[]{Integer.valueOf(MINIMUM_PASSWORD_LENGTH)}, 
       "The password must be at least [" + MINIMUM_PASSWORD_LENGTH + "] characters in length."); 
     } 
    } 
} 

क्या कोई मुझे प्रबुद्ध कर सकता है?

उत्तर

15

मैं डिफ़ॉल्ट संदेश समाधानकर्ता उपयोग कर रहा हूँ।

मेरी dispatcher-servlet.xml में, मैं

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basename" value="messages" /> 
</bean> 

और फिर मेरे कक्षाएं निर्देशिका के शीर्ष स्तर में मुझे लगता है कि इस तरह मैपिंग शामिल है "messages.properties" कहा जाता है एक पाठ फ़ाइल है:

error.firstname.null=Please enter your first name. 
error.lastname.null=Please enter your last name. 

आप एक कस्टम MessageCodesResolver आप MessageCodeResolver इंटरफ़ेस को लागू कर सकते हैं उपयोग करने के लिए और फिर इस तरह एक दिया नियंत्रक के लिए अपने समाधानकर्ता को परिभाषित करना चाहता था, तो:

<bean id="myController"> 
    <property name="messageCodesResolver" ref="myMessageCodesResolver" /> 
</bean> 

वर्तमान में विश्व स्तर पर एक कस्टम MessageCodeResolver परिभाषित करने के लिए एक तरह से नहीं है, enhancement request for that here है। सभी नियंत्रक बीन्स को एक नियंत्रक बीन परिभाषा से प्राप्त करने के लिए बीन विरासत का उपयोग करने का एक दृष्टिकोण, here वर्णित है।

+0

जानकारी के लिए धन्यवाद, यह मुझे मेरे वैधकर्ता का उपयोग करने के लिए पर्याप्त देता है। लेकिन सीखने के हित में मैं क्या करूँगा यदि मैं एक कस्टम संदेश कोडोडोलवर में रिवायर करना चाहता था, तो मैं कहां जाऊं? समृद्धि के लिए संसाधन संसाधन बंडल मैसेजसोर्स का जावाडोक http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/context/support/ResourceBundleMessageSource.html पर है। –

+1

यदि आप एक कस्टम MessageCodeResolver का उपयोग करना चाहते हैं, तो आप किसी दिए गए नियंत्रक के लिए एक असाइन कर सकते हैं। एक दृष्टिकोण, तब, सभी नियंत्रक बीन्स को एक नियंत्रक बीन परिभाषा से प्राप्त करने के लिए बीन विरासत का उपयोग करना है, जैसा कि यहां वर्णित है: http://forum.springsource.org/showthread.php?t=46336 वर्तमान में कोई तरीका नहीं है वैश्विक रूप से एक कस्टम MessageCodeResolver परिभाषित करने के लिए; इसके लिए यहां एक वृद्धि अनुरोध है: https://jira.springsource.org/browse/SPR-5187 –

+1

संदर्भ के लिए, वैश्विक कस्टम 'MessageCodeResolver' सुविधा अंततः स्प्रिंग 3.1 (2011) में कार्यान्वित की गई थी। यह भी देखें [एसपीआर -6506] (https://jira.spring.io/browse/SPR-6506)। – vallismortis

3

वे अपने MessageSource और एक MessagesCodeResolver द्वारा हल कर रहे हैं।

सत्यापन त्रुटियों के लिए इसी संदेशों Outputting आखिरी बात हम चर्चा करने की आवश्यकता है:

Here संदर्भ मैनुअल में प्रासंगिक अनुभाग है। उदाहरण में हमने ऊपर दिखाया है, हमने नाम और आयु क्षेत्र को खारिज कर दिया है। यदि हम MessageSource का उपयोग करके त्रुटि संदेशों को आउटपुट करने जा रहे हैं, तो हम इस क्षेत्र में फ़ील्ड ('नाम' और 'आयु' को अस्वीकार करते समय दिए गए त्रुटि कोड का उपयोग करके ऐसा करेंगे। जब आप फोन (या तो सीधे या परोक्ष रूप से, उदाहरण के लिए उपयोग कर रहा ValidationUtils वर्ग) rejectValue या अन्य Errors इंटरफ़ेस से तरीकों को अस्वीकार में से एक, अंतर्निहित कार्यान्वयन केवल कोड आप में उत्तीर्ण कर ली है की एक संख्या रिकॉर्ड नहीं करेगा, लेकिन यह भी अतिरिक्त त्रुटि कोड।

+0

आप कहाँ क्या MessageCodeResolver उपयोग करने के लिए परिभाषित करते हैं: त्रुटियों jsp टैग तो आप निम्न कर सकते हैं? –

+0

एक डिफ़ॉल्ट उदाहरण (DefaultMessageCodesResolver) का उपयोग किया जाता है यदि आप एक निर्दिष्ट नहीं करते हैं। आपको केवल एक संदेश स्रोत पंजीकृत करने की आवश्यकता है और इसका स्वचालित रूप से उपयोग किया जाएगा। –

+0

आप संदेश स्रोत कैसे पंजीकृत करते हैं? मैं संदेश कोडसोलवर को बीन संपत्ति के रूप में देखता हूं। लेकिन क्या पूरे संदेश में संदेशकोड रीसोलवर सार्वभौमिक के रूप में सेट करने का कोई तरीका है? –

1

किसी कारण यदि आप नियंत्रक प्रपत्र के समान में संदेशों को हल करना चाहते हैं के लिए:

//result is BindingResult 
    List<String> errors = new ArrayList<String>(); 
    List<ObjectError> allErrors = result.getAllErrors(); 
    for (ObjectError error : allErrors) { 
     String message = messageSource.getMessage(error, null); 
     errors.add(message); 
    } 
+0

मैं यह इंगित करना चाहता हूं कि संदेश स्रोत को नियंत्रक में @Autowired किया जा सकता है – leojh

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