Проверка на основе аннотаций Spring 3: пароль и подтверждение пароля - PullRequest
8 голосов
/ 30 августа 2011

В моем приложении Spring 3 MVC пользователям необходимо сохранить пароль, и было бы неплохо, если бы они также могли подтвердить пароль при сохранении.

В бине я использую аннотации на основеПроверка.Существует ли валидатор аннотаций для выполнения этой проверки?

После нескольких поисков в Google я нашел этот блог: http://gochev.blogspot.com/2010/06/spring-mvc-spring-bean-validation.html.Но я полагаю, что мне здесь не хватает jar-lib, поскольку Eclipse не может найти / предложить какие-либо jar-файлы.Кто-нибудь знает, какая банка мне нужна, чтобы это работало?

Заранее спасибо :)

Ответы [ 3 ]

8 голосов
/ 30 августа 2011

Я написал следующее для проверки паролей:

Реализация ограничения:

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

Мой объект DTO:

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

Наконец, мой контроллер

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

Кроме того, в Google вы найдете много примеров с проверкой bean-компонентов JSR-303.

3 голосов
/ 30 августа 2011

Требуется проверка гибернации и 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>

См. Этот вопрос: Проверка перекрестного поля с помощью Hibernate Validator (JSR 303)

Существует несколько способов решения этой проблемы.

0 голосов
/ 23 сентября 2017

Принятое решение, данное Сирилом Дебой, сработало и у меня. Но потом мне пришлось сделать еще одну аннотацию для ResetPassword и ChangePassword Page, поскольку они имеют разные DTO. Чтобы преодолеть это, я изменил isValid на код ниже. Хотя это может быть достигнуто путем реализации интерфейса тоже, но я думаю, что этот является более реалистичным. Надеюсь, это поможет.

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