Проверка уровня класса Spring и Thymeleaf - PullRequest
0 голосов
/ 10 июня 2018

Я изучаю Spring Framework и Thymeleaf.Я знал, как отобразить ошибку поля, используя что-то вроде ${#fields.errors("xx")}.Тем не менее, я застрял о том, как отобразить сообщение об ошибке объекта в Thymeleaf.

Вот мой UserForm класс:

@PasswordMatches
public class UserForm {
    @NotNull
    @NotEmpty
    private String username;
    @NotNull
    @NotEmpty
    private String password;
    @NotNull
    @NotEmpty
    private String matchingPassword;
    @NotNull
    @NotEmpty
    @ValidEmail
    private String email;

    /* setter and getter methods */

Вот мой PasswordMatches аннотация:

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) 
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PasswordMatchesValidator.class)
@Documented
public @interface PasswordMatches { 
    String message() default "Passwords don't match";
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {};
}

class PasswordMatchesValidator implements ConstraintValidator<PasswordMatches, Object> {  
    @Override
    public void initialize(PasswordMatches constraintAnnotation) {       
    }

    @Override
    public boolean isValid(Object obj, ConstraintValidatorContext context){   
        UserDto user = (UserDto) obj;
        return user.getPassword().equals(user.getMatchingPassword());    
  }     
}

Вот мой Контроллер метод:

@RequestMapping(value="/registration", method=RequestMethod.POST)
public ModelAndView registerUserAccount(@ModelAttribute("user") @Valid UserForm userForm,
          BindingResult result, WebRequest request, Errors errors) {
    if (!result.hasErrors()) {
        return new ModelAndView("registerSuccess");
    }
    else {
        return new ModelAndView("registration", "user", userForm);
    }
}

Теперь вот моя проблема: Если пароль *Поле 1021 * и поле verifyPass не совпадают. Как получить сообщение об ошибке по умолчанию, возвращаемое аннотацией уровня класса в Thymeleaf?

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Я знаю, что это старый пост, но я также столкнулся с этой проблемой, и вот решение (возможно, это также поможет кому-то еще): Измените PasswordMatchesValidator на это:

class PasswordMatchesValidator implements ConstraintValidator<PasswordMatches, Object> {  
@Override
public void initialize(PasswordMatches constraintAnnotation) {       
}

@Override
public boolean isValid(Object obj, ConstraintValidatorContext context){   
    UserDto user = (UserDto) obj;
    boolean isValid = user.getPassword().equals(user.getMatchingPassword());
    if(!isValid){
         context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate())
                .addPropertyNode( "matchingPassword" ).addConstraintViolation();
    }
    return isValid;

}

он свяжет результат проверки с вашим атрибутом «MatchPassword».Итак, в вашем шаблоне из тимьяна нам это нравится:

${#fields.errors("matchingPassword")}
0 голосов
/ 11 июня 2018

Добавьте это внутри тега form:

<p data-th-each="err : ${#fields.allErrors()}" data-th-text="${err}" class="error">
  Invalid input.
</p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...