Как отобразить сообщение об ошибке от пользовательской проверки на странице тимилиста - PullRequest
0 голосов
/ 12 апреля 2019

Похожий вопрос выложен здесь-> Spring + Thymeleaf настраиваемый дисплей проверки , но я не смог найти решение, поэтому разместил этот новый вопрос.У меня есть простая форма регистрации с полями username, email, password и verifyPassword

<form action="#" th:action="@{/register}" th:object="${user}"
method=post>

<!--error detection start  -->
<div class="alert alert-danger" th:if="${#fields.hasErrors('*')}">
    <p th:each="err : ${#fields.errors('*')}" th:text="${err}"></p>
</div>
<!--error detection ends  -->
<div class="form-group input-group">
    <div class="input-group-prepend">
        <span class="input-group-text"> <i class="fa fa-user"></i>
        </span>
    </div>
    <input name="username" th:field="*{username}" class="form-control"
        placeholder="User Name" type="text">
</div>
<div class="form-group input-group"
    th:if="${#fields.hasErrors('username')}" th:errors="*{username}">Name
    Error</div>

<!-- form-group// -->
<div class="form-group input-group">
    <div class="input-group-prepend">
        <span class="input-group-text"> <i class="fa fa-envelope"></i>
        </span>
    </div>
    <input name="email" th:field="*{email}" class="form-control"
        placeholder="Email address" type="email">
</div>
<div class="form-group input-group"
    th:if="${#fields.hasErrors('email')}" th:errors="*{email}">Name
    Error</div>

<div class="form-group input-group">
    <div class="input-group-prepend">
        <span class="input-group-text"> <i class="fa fa-lock"></i>
        </span>
    </div>
    <input class="form-control" th:field="*{password}"
        placeholder="Create password" type="password">
</div>
<!-- form-group// -->
<div class="form-group input-group">
    <div class="input-group-prepend">
        <span class="input-group-text"> <i class="fa fa-lock"></i>
        </span>
    </div>
    <input class="form-control" th:field="*{confirmPassword}"
        placeholder="Repeat password" type="password">
    <p class="error-message"
        th:each="error: ${#fields.errors('user.confirmPassword')}"
        th:text="${error}">Validation error</p>
</div>
<!-- form-group// -->
<div class="form-group">
    <button type="submit" class="btn btn-primary btn-block">
        Create Account</button>
</div>
<!-- form-group// -->
<p class="text-center">
    Have an account? <a href="">Log In</a>
</p>
</form>

. Я добавил пользовательскую проверку, которая вызывает триггер, когда поля пароля и подтверждения пароля не совпадают.

1.FieldsValueMatchValidator

public class FieldsValueMatchValidator implements ConstraintValidator<FieldsValueMatch, Object> {

private String field;
private String fieldMatch;

public void initialize(FieldsValueMatch constraintAnnotation) {
    this.field = constraintAnnotation.field();
    this.fieldMatch = constraintAnnotation.fieldMatch();
}

public boolean isValid(Object value, ConstraintValidatorContext context) {

    Object fieldValue = new BeanWrapperImpl(value).getPropertyValue(field);
    Object fieldMatchValue = new BeanWrapperImpl(value).getPropertyValue(fieldMatch);

    if (fieldValue != null) {
        return fieldValue.equals(fieldMatchValue);
    } else {
        return fieldMatchValue == null;
    }

}

}

3.FieldsValueMatch

@Constraint(validatedBy = FieldsValueMatchValidator.class)
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldsValueMatch {

String message() default "Fields values don't match!";

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

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

String field();

String fieldMatch();

@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@interface List {
    FieldsValueMatch[] value();
}
}

4.User.java

@FieldsValueMatch(field = "password", fieldMatch = "confirmPassword", message = "Passwords do not match!")
@Entity
public class User implements UserDetails
{
    @NotBlank
    private String password;

    @Transient
    @NotBlank
    private String confirmPassword;
        //other getters and setters
}

5. Код контроллера

@PostMapping("/register")
public String saveNonJsonData(@Valid @ModelAttribute("user") User theUser, BindingResult errors) {
if (errors.hasErrors()) {
    return "register";
}
else
{
//successlogic
}

ПользовательскийВалидатор работает нормально, и я вижу сообщение об ошибке на странице, используя следующий код на странице тимилифа

<!--error detection start  -->
<div class="alert alert-danger" th:if="${#fields.hasErrors('*')}">
    <p th:each="err : ${#fields.errors('*')}" th:text="${err}"></p>
</div>
<!--error detection ends  -->

Как уже упоминалось здесь - Spring + Thymeleaf настраиваемый дисплей проверки проблема в настраиваемом валидаторевозвращая ObjectError для проверки соответствия поля пароля, а не fieldError.Несмотря на то, что я попробовал решение, при условии, что я не могу понять, как заставить Thymeleaf отображать мою пользовательскую ошибку.

ОБНОВЛЕНИЕ Получил еще один ответ здесь ОтображениеНастраиваемое аннотационное сообщение «Пароли не совпадают» , и теперь я вижу сообщение об ошибке, используя следующий код

<input class="form-control" th:field="*{confirmPassword}" placeholder="Repeat password" type="password">
<div class="form-group input-group" th:if="${#fields.hasErrors('global')}" th:errors="*{global}"></div>

Мой обновленный вопрос, если у меня есть еще два поля, например «электронная почта» и «Подтверждение электронной почты»'тогда как этот подход будет работать на странице тимелист?

...