2010-11-15 12 views
9

Estoy intentando sobrescribir ResourceBundleLocator predeterminado en la validación de hibernación 4.1. Hasta ahora funciona perfectamente, pero los únicos ejemplos de su uso incluyen el código de Java para crear instancias de ValidationFactory.Hibernate Validator, ResourceBundleLocator personalizado y Spring

Cuando se utiliza una aplicación web con hibernación de muelles, la validación se configura automáticamente (solo debe existir el archivo de hibernación * .jar adecuado y se usa automáticamente). ¿Cómo puedo sustituir ResourceBundleLocator en ese escenario? No veo ninguna forma de especular mi ResourceBundleLocator personalizado en cualquier propiedad o archivo applicationContext.xml.

Respuesta

18

El método mágico que realiza el trabajo requerido es LocalValidatorFactoryBean#setValidationMessageSource(MessageSource messageSource).

En primer lugar, el contrato del método: -

Especifique un MessageSource primavera a medida para resolver la validación mensajes, en lugar de confiar en defecto de JSR-303 "ValidationMessages.properties" paquete en el classpath. Esto puede referirse a un bean de contexto compartido de Spring "messageSource", oa alguna configuración de MessageSource especial para propósitos de validación solamente.

NOTA: Esta función requiere Hibernate Validador 4.1 o superior en la ruta de clase . No obstante, puede utilizar un proveedor de validación diferente de , pero debe tener acceso a Validación de Hibernate ResourceBundleMessage Interpolator durante la configuración .

Especifique esta propiedad o "messageInterpolator", no ambos. Si que le gustaría construir una MessageInterpolator encargo , considere que deriva de ResourceBundleMessageInterpolator de Hibernate Validator y que pasa en una primavera MessageSourceResourceBundleLocator cuando se construye el interpolador.

Puede especificar sus message.properties personalizados (o .xml) mediante la invocación de este método ... así ...

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

Aquí es una solución si usted quiere mezclar los mensajes de validación de hibernación existentes y los mensajes de validación personalizada:

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

(ver Web MVC framework Validation section y Configuring a Bean Validation Provider en Documentación de primavera)

+0

dónde usar el validador Bean en la configuración basada en anotación (configuración completa de Java sin XML). – karthi

Cuestiones relacionadas