2011-08-30 40 views
7

En mi aplicación Spring 3 MVC los usuarios necesitan guardar una contraseña y sería una buena característica si también pudieran confirmar la contraseña al guardarla.Spring 3 validación basada en anotación: contraseña y contraseña de confirmación

En el bean estoy usando la validación basada en anotación. ¿Hay un validador de anotaciones disponible para realizar esta comprobación?

Después de algunos googleing encontré este blog: http://gochev.blogspot.com/2010/06/spring-mvc-spring-bean-validation.html. Pero creo que me falta un jar-lib aquí ya que Eclipse no puede encontrar/sugerir ningún jarrón. ¿Alguien sabe qué jarra necesito para que esto funcione?

Gracias de antemano :)

Respuesta

3

Necesita el tarro de 303 Api Hibernate Validación y JSR.

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>4.1.0.Final</version>       
    </dependency> 
    <dependency> 
     <groupId>javax.validation</groupId> 
     <artifactId>validation-api</artifactId> 
     <version>1.0.0.GA</version> 
    </dependency> 

Ver esta pregunta: Cross field validation with Hibernate Validator (JSR 303)

hay varias maneras de hacer frente a ese problema.

7

me escribió lo siguiente con el fin de validar las contraseñas: aplicación

Restricción:

package com.test.web.validation.user; 

import java.lang.annotation.Documented; 
import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import javax.validation.Constraint; 
import javax.validation.Payload; 

@Target({ ElementType.TYPE }) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Constraint(validatedBy = PasswordsEqualConstraintValidator.class) 
public @interface PasswordsEqualConstraint { 
String message(); 

Class<?>[] groups() default {}; 

Class<? extends Payload>[] payload() default {}; 
} 

package com.test.web.validation.user; 

import javax.validation.ConstraintValidator; 
import javax.validation.ConstraintValidatorContext; 

import com.test.logic.dto.UserDto; 

public class PasswordsEqualConstraintValidator implements 
    ConstraintValidator<PasswordsEqualConstraint, Object> { 

@Override 
public void initialize(PasswordsEqualConstraint arg0) { 
} 

@Override 
public boolean isValid(Object candidate, ConstraintValidatorContext arg1) { 
    UserDto user = (UserDto) candidate; 
    return user.getPassword().equals(user.getPasswordRepeat()); 
} 
} 

Mi DTO objeto:

package com.test.logic.dto; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Size; 

import com.esldic.web.validation.user.EmailExistsConstraint; 
import com.esldic.web.validation.user.PasswordsEqualConstraint; 

@PasswordsEqualConstraint(message = "passwords are not equal") 
public final class UserDto extends AbstractDto implements Serializable { 

private static final long serialVersionUID = 1L; 

private Long id; 

@NotNull 
@Size(min = 3, max = 30) 
@EmailExistsConstraint(message = "email is not available") 
private String email; 

private String username; 

@NotNull 
@Size(min = 2, max = 30) 
private String password; 

@NotNull 
@Size(min = 2, max = 30) 
private String passwordRepeat; 
... 
} 

Por último, mi regulador

package com.test.web.controllers; 

import java.util.Set; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.validation.ConstraintViolation; 
import javax.validation.Validator; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 
import org.springframework.web.servlet.ModelAndView; 

import com.test.logic.dto.UserDto; 

@Controller 
public final class SignupController { 

@Autowired 
private Validator validator; 

@RequestMapping(value = "/signup.html", method = RequestMethod.POST) 
public @ResponseBody 
ModelAndView handleSignupForm(@ModelAttribute UserDto candidate, 
     HttpServletResponse response) throws ServiceException { 
    Set<ConstraintViolation<UserDto>> failures = validator 
      .validate(candidate); 

    if (!failures.isEmpty()) { 
     response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
     return ValidationHelper.validationMessages(failures); 

    } else { 
     return userService.create(candidate); 
    } 
} 

Además, en google encontrarás muchas muestras con validación de beans JSR-303.

0

La solución aceptada por Cyril Deba también me ha funcionado. Pero luego tuve que hacer otra anotación para ResetPassword y ChangePassword Page, ya que tienen DTO diferente. Para superar eso, cambié isValid al código siguiente. Aunque podría lograrse implementando una interfaz también, pero creo que esta es más realista. Espero que ayude

@Override 
public boolean isValid(Object candidate, ConstraintValidatorContext context) { 

    try { 
     Method methodGetPassword = candidate.getClass().getMethod("getPassword"); 
     Method methodGetConfirmpassword = candidate.getClass().getMethod("getConfirmpassword"); 

     if(methodGetPassword.invoke(candidate) == null && methodGetConfirmpassword.invoke(candidate)==null) 
      return true; 
     else if(methodGetPassword.invoke(candidate) == null) 
      return false; 
     return methodGetPassword.invoke(candidate).equals(methodGetConfirmpassword.invoke(candidate)); 

    } catch (NoSuchMethodException ex) { 
     ex.printStackTrace(); 
     return false; 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
     return false; 
    } 
} 
Cuestiones relacionadas