2010-11-15 19 views
9

Sto tentando di ignorare il ResourceBundleLocator predefinito nella convalida di ibernazione 4.1. Finora funziona perfettamente, ma gli unici esempi del suo utilizzo includono il codice java per istanziare ValidationFactory.Hibernate Validator, ResourceBundleLocator personalizzato e Spring

Quando si utilizza un'applicazione Web con la sospensione della primavera, la convalida viene configurata automaticamente (deve essere presente solo il file di convalida di ibernazione adatto * .jar e viene utilizzato automaticamente). Come posso sostituire ResourceBundleLocator in quello scenario? Non vedo alcun modo di speci fi care il mio ResourceBundleLocator personalizzato in qualsiasi proprietà o nel file applicationContext.xml.

risposta

18

Il metodo magico che esegue il lavoro richiesto è LocalValidatorFactoryBean#setValidationMessageSource(MessageSource messageSource).

Prima di tutto, il contratto del metodo: -

Specificare una molla MessageSource personalizzato per risolvere la convalida messaggi, invece di basarsi su di default di JSR-303 "ValidationMessages.properties" fascio nel classpath. Questo può riferirsi al bean "messageSource" condiviso dal contesto di Spring, o ad alcune impostazioni speciali di MessageSource per per soli scopi di convalida .

NOTA: Questa funzionalità richiede Sospensione Validator 4.1 o superiore sul classpath. Tuttavia, è possibile utilizzare un provider di convalida diverso ma la classe ResourceBundleMessageInterpolator per la classe deve essere accessibile durante la configurazione .

Specificare questa proprietà o "messaggioInterpolatore", non entrambi. Se si vorrebbe costruire un MessageInterpolator personalizzato , in considerazione derivante dalla ResourceBundleMessageInterpolator di Hibernate Validator e passando un primavera MessageSourceResourceBundleLocator quando si costruisce il vostro interpolatore.

È possibile specificare le message.properties personalizzati (o .xml) invocando questo metodo ... così ...

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

Ecco una soluzione se si vuole mescolare i messaggi di validazione di sospensione esistenti e messaggi di convalida personalizzato:

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

(vedi Web MVC framework Validation section e Configuring a Bean Validation Provider in Documentazione di primavera)

+0

dove utilizzare il validatore bean in configurazione basata su annotazioni (configurazione Java completa senza XML). – karthi

Problemi correlati