2010-11-15 13 views
9

Próbuję przesłonić domyślny ResourceBundleLocator w sprawdzaniu hibernacji 4.1. Jak dotąd działa idealnie, ale jedynymi przykładami jego użycia są kod Java, który tworzy instancję ValidationFactory.Validator hibernacji, niestandardowy ResourceBundleLocator i Spring

Podczas korzystania z aplikacji sieciowej z funkcją sprawdzania hibernacji wiosny jest automatycznie konfigurowana (powinien istnieć tylko odpowiedni plik * .jar sprawdzania poprawności *). Jak mogę zastąpić ResourceBundleLocator w tym scenariuszu? Nie widzę żadnego sposobu określenia mojego niestandardowego obiektu ResourceBundleLocator w żadnych właściwościach lub pliku applicationContext.xml.

Odpowiedz

18

Magiczną metodą wykonywania wymaganego zadania jest LocalValidatorFactoryBean#setValidationMessageSource(MessageSource messageSource).

Przede wszystkim umowa metody: -

określić niestandardową Wiosna MessageSource rozwiązywania walidacji wiadomości, zamiast opierania się na domyślne JSR-303 za "ValidationMessages.properties" bundle w ścieżce klas. Może to odnosić się do współużytkowanego komponentu bean messageSource , lub do specjalnej konfiguracji środowiska MessageSource dla celów walidacji .

UWAGA: Ta funkcja wymaga hibernacji Validator 4.1 lub wyższy od ścieżce klasy. Mimo to można użyć innego dostawcy sprawdzania poprawności, ale klasa klasy Hibernuj walidatora musi być dostępna podczas konfiguracji .

Podaj tę właściwość lub "messageInterpolator", a nie obie. Jeśli chcesz zbudować zwyczaj MessageInterpolator rozważyć wynikające z Hibernate Validator za ResourceBundleMessageInterpolator i przechodzącej w wiosennej MessageSourceResourceBundleLocator przy konstruowaniu swój interpolator.

Można określić niestandardowe message.properties (lub .xml), powołując się na tę metodę ... tak ...

my-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.java

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

Oto rozwiązanie, jeśli chcesz mieszać istniejących wiadomości walidacji hibernacji i niestandardowych komunikatów walidacji

<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> 

(patrz Web MVC framework Validation section i Configuring a Bean Validation Provider w Dokumentacja wiosna)

+0

gdzie użyć walidatora komponent bean w konfiguracji opartej na adnotacjach (pełna konfiguracja Java bez XML). – karthi

Powiązane problemy