Spring 3 annotation-based checks: password and password confirmation

In my Spring 3 MVC application, users need to save the password, and it would be nice if they could also confirm the password when saving.

In bean, I use annotation-based validation. Is there an annotation checker available to perform this check?

After some googleing, I found this blog: http://gochev.blogspot.com/2010/06/spring-mvc-spring-bean-validation.html . But I think I do not see jar-lib here, since Eclipse cannot find / offer any banks. Does anyone know what I need for this?

Thanks in advance:)

+7
source share
3 answers

I wrote the following to verify passwords:

Compliance with restrictions:

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()); } } 

My DTO object:

 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; ... } 

Finally my controller

 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); } } 

In addition, on google you will find many samples with the JSR-303 bean check.

+7
source

You need validation of Hibernate and JSR 303 Api.

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

Have a look at this question: Validating fields with the Hibernate Validator (JSR 303)

There are several ways to solve this problem.

+3
source

The decision made by Cyril Deba also worked for me. But then I had to make another annotation for the ResetPassword and ChangePassword pages, since they have different DTOs. To overcome this, I changed the Valid value below the code. Although this can be achieved through the implementation of the interface, but I think it is more realistic. Hope this helps.

 @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; } } 
0
source

All Articles