2010-11-15 14 views
9

मैं हाइबरनेट सत्यापन 4.1 में डिफ़ॉल्ट संसाधनबंडल लोकेटर को ओवरराइड करने का प्रयास कर रहा हूं। अब तक यह पूरी तरह से काम करता है, लेकिन इसके उपयोग के एकमात्र उदाहरणों में वैलिडेशन फैक्ट्री को तुरंत चालू करने के लिए जावा कोड शामिल है।हाइबरनेट वैलिडेटर, कस्टम रिसोर्सबंडल लोकेटर और स्प्रिंग

वसंत हाइबरनेट सत्यापन के साथ एक वेब अनुप्रयोग का उपयोग करते समय स्वचालित रूप से कॉन्फ़िगर किया जाता है (केवल उपयुक्त हाइबरनेट सत्यापन * .jar फ़ाइल मौजूद होना चाहिए और यह स्वचालित रूप से उपयोग किया जाता है)। मैं उस परिदृश्य में संसाधनबंडल लोकेटर को कैसे बदल सकता हूं? मुझे किसी भी गुण या applicationContext.xml फ़ाइल में मेरे कस्टम संसाधन BundleLocator spe speffing का कोई तरीका नहीं दिख रहा है।

उत्तर

18

आवश्यक कार्य करने वाली जादू विधि LocalValidatorFactoryBean#setValidationMessageSource(MessageSource messageSource) है।

सबसे पहले, विधि का अनुबंध: -

, मान्यता संदेशों को हल करने के लिए एक कस्टम वसंत MessageSource निर्दिष्ट बजाय "ValidationMessages.properties" JSR-303 के डिफ़ॉल्ट पर निर्भर के बंडल कक्षा में। यह स्प्रिंग संदर्भ के साझा "संदेश स्रोत" बीन, या कुछ सत्यापन उद्देश्यों के लिए विशेष संदेश स्रोत सेटअप का संदर्भ ले सकता है।

नोट: यह सुविधा classpath पर हाइबरनेट सत्यापनकर्ता 4.1 या उच्चतर की आवश्यकता है। फिर भी आप विभिन्न सत्यापन प्रदाता का उपयोग कर सकते हैं लेकिन हाइबरनेट वैलिडेटर के संसाधनबंडल मैसेजइंटरपोलेटर कक्षा कॉन्फ़िगरेशन के दौरान पहुंच योग्य होनी चाहिए।

या तो यह संपत्ति या "messageInterpolator" निर्दिष्ट करें, दोनों नहीं। यदि आप एक कस्टम MessageInterpolator निर्माण हाइबरनेट सत्यापनकर्ता के ResourceBundleMessageInterpolator और MessageSourceResourceBundleLocator एक स्प्रिंग में गुजर जब अपने क्षेपक के निर्माण से पाने पर विचार करना चाहते हैं।

आप इस पद्धति लागू ... इस तरह से अपने कस्टम message.properties (या .xml) निर्दिष्ट कर सकते हैं ...

मेरी-beans.xml

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

<bean name="resourceBundleLocator" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>META-INF/validation_errors</value> 
     </list> 
    </property> 
</bean> 

validation_errors.properties

javax.validation.constraints.NotNull.message=MyNotNullMessage 

Person.java

class Person { 
    private String firstName; 
    private String lastName; 

    @NotNull 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

BeanValidationTest।जावा

public class BeanValidationTest { 

    private static ApplicationContext applicationContext; 

    @BeforeClass 
    public static void initialize() { 
     applicationContext = new ClassPathXmlApplicationContext("classpath:META-INF/spring/webmvc-beans.xml"); 
     Assert.assertNotNull(applicationContext); 
    } 

    @Test 
    public void test() { 
     LocalValidatorFactoryBean factory = applicationContext.getBean("validator", LocalValidatorFactoryBean.class); 
     Validator validator = factory.getValidator(); 
     Person person = new Person(); 
     person.setLastName("dude"); 
     Set<ConstraintViolation<Person>> violations = validator.validate(person); 
     for(ConstraintViolation<Person> violation : violations) { 
      System.out.println("Custom Message:- " + violation.getMessage()); 
     } 
    } 

} 

Outupt:Custom Message:- MyNotNullMessage

4

यहाँ एक समाधान है अगर आप मौजूदा हाइबरनेट सत्यापन संदेश और कस्टम सत्यापन संदेश मिश्रण करना चाहते हैं:

<mvc:annotation-driven validator="validator" /> 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="validationMessageSource" ref="messageSource"/> 
</bean> 
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames" value="i18n,iso-i18n,org.hibernate.validator.ValidationMessages" /> 
    <property name="useCodeAsDefaultMessage" value="true" /> 
</bean> 

(Web MVC framework Validation section और Configuring a Bean Validation Provider देखने में वसंत दस्तावेज)

+0

जहां वैधकर्ता का उपयोग करना है एनोटेशन आधारित कॉन्फ़िगरेशन में बीन (एक्सएमएल के बिना पूर्ण जावा कॉन्फ़िगरेशन)। – karthi

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