2011-08-30 10 views
7

W mojej wiosennej aplikacji 3 MVC użytkownicy muszą zapisać hasło i byłoby to fajną opcją, gdyby również byli w stanie potwierdzić hasło po zapisaniu.Weryfikacja w oparciu o 3 adnotacje: hasło i potwierdzenie hasła

W komponencie bean używam sprawdzania poprawności opartego na adnotacjach. Czy jest dostępny walidator adnotacji do wykonywania tego sprawdzania?

Po kilku spotkaniach w Google znalazłem ten blog: http://gochev.blogspot.com/2010/06/spring-mvc-spring-bean-validation.html. Ale domyślam się, że brakuje mi tutaj lib-lib, ponieważ Eclipse nie może znaleźć/zasugerować żadnych słoików. Czy ktoś wie, jakiego słoika potrzebuję, aby to zadziałało?

Z góry dzięki :)

Odpowiedz

3

Musisz Hibernacja Validation i JSR 303 Api jar.

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

Zobacz na to pytanie: Cross field validation with Hibernate Validator (JSR 303)

Istnieje kilka sposobów radzenia sobie z tym problemem.

7

napisałem następujące w celu weryfikacji haseł: Realizacja

Ograniczenie:

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

Moje DTO obiektu:

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

Wreszcie mój kontroler

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

Ponadto w google znajdziesz wiele próbek z sprawdzaniem fasoli JSR-303.

0

Zaakceptowane rozwiązanie podjęte przez Cyryla Deba działało również dla mnie. Ale potem musiałem dokonać kolejnej adnotacji na stronach ResetPassword i ChangePassword, ponieważ mają one różne DTO. Aby przezwyciężyć to, zmieniłem isValid na poniższy kod. Mimo, że można to osiągnąć poprzez implementację interfejsu, ale myślę, że ten jest bardziej realistyczny. Mam nadzieję, że to pomoże.

@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; 
    } 
} 
Powiązane problemy