2011-12-22 20 views
9

Estoy creando una aplicación de demostración usando spring mvc 3.0. Tengo que aplicar la validación en la pantalla. Busco en la red y descubrí que hay principalmente 2 tipos de validación que se usan con el de aplicación: - validacionesValidación de primavera vs validación de Hibernate usando la anotación

  1. Spring utilizando validaciones Api
  2. de validación usando Hibernate validaciones de hibernación

con suerte alguien me dan la sugerencia de los cuales uno es bueno para poner en práctica en la aplicación.

Respuesta

9

Utilicé ambas - Me gusta más la Validación de Hibernate - bastante fácil de implementar y bastante estándar. Se habilita automáticamente cuando tiene una implementación en el classpath. Aquí hay un ejemplo:

@EmailValidator 
@NotBlank 
@Length(max=65) 
private String email; 

¿De dónde viene el mensaje Error String? En WEB-INF debe tener un archivo llamado messages.properties:

NotBlank.ForgotPasswordBackingObject.email=Email address must be present 

Hay una anotación @email estándar, pero un correo electrónico tales como: Me @ miempresa se considera válido, que es por lo que tenía que hacer mi propio @EmailValidator (cambió una bandera de expresión regular de * a + en la implementación estándar). Hay algunos problemas que me encontré: El orden de validación - Validación de la cual usted quiere que suceda primero, esto se hace con grupos de validación, pero esto no es posible con la anotación @Valid, por ejemplo:

@RequestMapping(method=RequestMethod.POST, value="/auth/changePassword") 
public ModelAndView submitChangePasswordPage(@Valid @ModelAttribute("ChangePasswordBackingObject") ChangePasswordBackingObject backingObject, BindingResult result, Principal principal) 

Es por eso que si tiene su Controlador de esta forma (en Spring MVC, por ejemplo), entonces tiene que simular su lógica de alguna manera; yo también lo he hecho.

Otra cosa fresca que usted puede hacer para validar dos o más campos en en el tiempo (que me pareció bastante útil):

@FieldMatch.List({ 
    @FieldMatch(firstValue = "password" , secondValue = "confirmPassword") 
}) 
public class RequestAccountBackingObject implements Serializable { 
    private String password; 
    private String confirmPassword; 

Y la aplicación:

@Target({TYPE, ANNOTATION_TYPE}) 
@Retention(RUNTIME) 
@Constraint(validatedBy = FieldMatchImpl.class) 
@Documented 
public @interface FieldMatch{ 
    String message() default "{com.errorMessage}"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
    String firstValue(); 
    String secondValue(); 
    @Target({TYPE, ANNOTATION_TYPE}) 
    @Retention(RUNTIME) 
    @Documented 
    @interface List 
    { FieldMatch[] value(); } 
} 

El otro FieldMatchImpl sería:

public class FieldMatchImpl implements ConstraintValidator<FieldMatch, Object>{ 
    private String firstFieldName; 
    private String secondFieldName; 

y necesita dos métodos implementados:

public void initialize(final FieldMatch constraintAnnotation){ 
    firstFieldName = constraintAnnotation.firstValue(); 
    secondFieldName = constraintAnnotation.secondValue(); 

también:

public boolean isValid(final Object value, final ConstraintValidatorContext context){ 

    final String firstObj = BeanUtils.getProperty(value, firstFieldName); 
    final String secondObj = BeanUtils.getProperty(value, secondFieldName); 

Usando org.apache.commons.beanutils.BeanUtils ahora se puede validar los dos campos.

De esta manera:

boolean result = firstObj.equals(secondObj); 
if(!result) { 
    context.disableDefaultConstraintViolation(); 
    context.buildConstraintViolationWithTemplate(errorMessage).addNode(firstFieldName).addConstraintViolation(); 
} 

Aparte de eso, ha sido un placer usar el Hibernate validación hasta el momento.

+0

Gracias por dar una buena comprensión, responde Eugene, ¿Qué hay de la otra validación ...? – Anshul

+0

Me gustaría poder detallar una respuesta para usted, pero ha pasado mucho tiempo desde que utilicé la validación de Spring.:(Y como JSR 303 se convierte en especificación e Hibernate Validator es la implementación de referencia, realmente creo que Spring se orientará en la misma dirección. – Eugene

Cuestiones relacionadas