que mvc funciona crear configurar configuración conceptos como bean anotaciones java validation spring-modules

java - mvc - que es un bean en spring



anotación basada en la anotación Spring bean (3)

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

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

.... <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 de configuración utilizado en el tutorial.

Convertidor de ejemplo:

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ían funcionar:

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

Estoy investigando un enfoque basado en anotaciones para validar Spring beans usando módulos de primavera . En este tutorial , se utiliza el siguiente bean (getters y setters omitidos) como ejemplo:

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 una regla de validación particular se desobedece debe seguir este formato:

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

Los ejemplos para la clase mostrada arriba 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 mensaje contengan el nombre de clase presenta un par de problemas:

  1. Si se cambia el nombre de la clase, las claves de mensaje también deben cambiarse
  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, por ejemplo

    Person.email [not.blank] = Ingrese 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, la documentación afirma que es posible configurar un mensaje predeterminado para una regla en particular (por ejemplo, @Email) como este:

email=email address is invalid

Este mensaje predeterminado debe usarse si no se puede encontrar un mensaje específico de bean para la regla. 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 predeterminado para la regla @Email

badEmail=Email address is invalid

Este mensaje se debe usar si anoto la propiedad relevante de esta manera:

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

Sin embargo, intenté esto, 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?


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

org.springmodules.validation.bean.converter.KeepAsIsErrorCodeConverter

Cuando se usa esto, el paquete de recursos se comprobará para 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 el mismo que el nombre de la clave del modelo que hace referencia al bean de respaldo del formulario.
  • fieldName es el nombre del campo.
  • fieldClassName es el nombre de la clase de campo, por ejemplo. java.lang.String, java.lang.Integer

Así, por ejemplo, si tengo un bean al que se hace referencia en el modelo con la clave "formBean" y el campo emailAddress de tipo java.lang.String no 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 mensaje:

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

Si el código de error es reemplazado por el código de error "badEmail" como este:

@Email (errorCode = "badEmail")

Los códigos de mensajes que el marco tratará de resolver serán:

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

Sugeriría mantener el 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.


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