2008-09-29 20 views
14

Estoy investigando un enfoque basado en anotaciones para validar Spring beans usando spring modules. En this tutorial, los de frijol siguientes (captadores y definidores omitidos) se utiliza como un ejemplo:basado en anotación Spring bean validation

public final class User { 

    @NotBlank 
    @Length(max = 80) 
    private String name; 

    @NotBlank 
    @Email 
    @Length(max = 80) 
    private String email; 

    @NotBlank 
    @Length(max = 4000) 
    private String text; 
} 

El mensaje de error que se utiliza si se desobedece una regla de validación particular, debe seguir el siguiente formato:

bean-class.bean-propery[validation-rule]=Validation Error message 

Ejemplos de la clase mostrada anteriormente incluyen:

User.email[not.blank]=Please enter your e-mail address. 
User.email[email]=Please enter a valid e-mail address. 
User.email[length]=Please enter no more than {2} characters. 

el hecho de que las claves de mensajes contienen el nombre de la clase presenta un par de problemas:

  1. Si se cambia el nombre de la clase, las claves de mensaje también necesita ser cambiado
  2. Si tengo otra clase (por ejemplo, Persona) con una propiedad de correo electrónico validada de manera idéntica a User.email. Necesito duplicar los mensajes, p.

    Person.email [not.blank] = Por favor, introduzca su dirección de correo electrónico.
    Person.email [email] = Ingrese una dirección de correo electrónico válida.
    Person.email [length] = Ingrese no más de {2} caracteres.

De hecho, las demandas de documentación que es posible configurar un mensaje predeterminado para una regla particular (por ejemplo @email) así:

email=email address is invalid 

Este mensaje predeterminado se debe utilizar si un Bean- mensaje específico para la regla no se puede encontrar. Sin embargo, mi experiencia es que esto simplemente no funciona.

Un mecanismo alternativo para evitar mensajes duplicados es pasar la clave del mensaje de error a la anotación de la regla. Por ejemplo, supongamos que he definido el siguiente mensaje de error por defecto para la regla @email

badEmail=Email address is invalid 

Este mensaje debe ser utilizado si anoto la propiedad relevante de esta manera:

@Email(errorCode="badEmail") 
private String email; 

Sin embargo yo probamos este, una y otra vez, simplemente no parece funcionar. ¿Alguien ha encontrado una forma de evitar la duplicación de mensajes de error cuando se utiliza este marco de validación?

Respuesta

6

Eché un vistazo rápido al BeanValidator API, y parece que es posible que desee probar la propiedad errorCodeConverter.

¿Necesitaría implementar su propio ErrorCodeConverter, o usar una de las implementaciones provistas?

.... 
<bean id="validator" class="org.springmodules.validation.bean.BeanValidator" 
    p:configurationLoader-ref="configurationLoader" 
    p:errorCodeConverter-ref="errorCodeConverter" /> 

<bean id="errorCodeConverter" class="contact.MyErrorCodeConverter" /> 
.... 

Nota: configurationLoader es otro bean definido en el XML config utilizado en el tutorial

Ejemplo convertidor:

package contact; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.springmodules.validation.bean.converter.ErrorCodeConverter; 

public class MyErrorCodeConverter implements ErrorCodeConverter { 

    private Log log = LogFactory.getLog(MyErrorCodeConverter.class); 

    @Override 
    public String convertPropertyErrorCode(String errorCode, Class clazz, String property) { 
     log.error(String.format("Property %s %s %s", errorCode, clazz.getClass().getName(), property)); 
     return errorCode; // <------ use the errorCode only 
    } 

    @Override 
    public String convertGlobalErrorCode(String errorCode, Class clazz) { 
     log.error(String.format("Global %s %s", errorCode, clazz.getClass().getName())); 
     return errorCode; 
    } 
} 

Ahora las propiedades debería funcionar:

MyEmailErrorCode=Bad email 

class Foo { 
    @Email(errorCode="MyEmailErrorCode") 
    String email 
} 
+0

En la configuración de Spring que se muestra arriba, ¿qué es el bean configurationLoader? –

+0

Hola, Don: descargué el código fuente del sitio web del tutorial que mencionaste, y configurationLoader ya es uno de los beans definidos en su config xml. Cuando llego a casa y miro el código que escribí, puedo actualizar esta publicación. – toolkit

+0

El bean configurationLoader del tutorial es de tipo org.springmodules.validation.bean.conf.loader.annotation.AnnotationBeanValidationConfigurationLoader – toolkit

2

La validación de primavera tiene un errorCod eConversor que hace esto:

org.springmodules.validation.bean.converter.KeepAsIsErrorCodeConverter

Cuando se utiliza, el paquete de recursos será revisado por los siguientes códigos:

[errorCode.commandBeanName.fieldName , errorCode.fieldName, errorCode.fieldClassName, errorCode]

  • errorCode es el código de error de validación real, por ejemplo. not.blank, correo electrónico.
  • commandBeanName es igual que el nombre de la clave del modelo que hace referencia al bean de respaldo de la forma .
  • fieldName es el nombre del campo.
  • fieldClassName es el nombre de la clase de campo, por ej. java.lang.String, java.lang.Integer

Así, por ejemplo, si tengo un grano que se hace referencia en el modelo de la tecla "FormBean" y el emailAddress campo de tipo java.lang.String no lo hace contiene una dirección de correo electrónico, lo que provoca el errorCódigo de correo electrónico. El marco de validación intentará resolver los siguientes códigos de mensajes:

[email.formBean.emailAddress, email.emailAddress, email.java.lang.String, correo electrónico]

Si el errorCode se sustituye por el errorCode " badEmail" de esta manera:

@email (errorCode = "badEmail")

los códigos de los mensajes que el marco intentará resolver será:

[badEmail.formBean.emailAddress, badEmail.emailAddress, badEmail .Java. lang.String, badEmail]

Sugeriría mantener errodCode igual. Por lo tanto, se puede usar un mensaje para todos los campos que tienen ese código de error asociado. Si necesita ser más específico con el mensaje para un determinado campo, puede agregar un mensaje a los paquetes de recursos con el código errorCode.commandBeanName.field.

0

Agregue los siguientes beans en su archivo applicationContext.xml.

<bean id="configurationLoader" 
    class="org.springmodules.validation.bean.conf.loader.annotation.AnnotationBeanValidationConfigurationLoader" /> 

<!-- Use the error codes as is. Don't convert them to <Bean class name>.<bean field being validated>[errorCode]. -->  
<bean id="errorCodeConverter" 
    class="org.springmodules.validation.bean.converter.KeepAsIsErrorCodeConverter"/> 

<!-- shortCircuitFieldValidation = true ==> If the first rule fails on a field, no need to check 
    other rules for that field --> 
<bean id="validator" class="org.springmodules.validation.bean.BeanValidator" 
    p:configurationLoader-ref="configurationLoader" 
    p:shortCircuitFieldValidation="true" 
    p:errorCodeConverter-ref="errorCodeConverter"/> 
Cuestiones relacionadas