Проверка пользовательской формы в Spring boot

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

public class PasswordResetForm {

    @NotEmpty
    @Size(min=6, message="must be at least 6 characters")
    private String password;

    private String passwordConfirm;

    //Getter and Setters
}

Итак, теперь я хочу проверить, равны ли поля passwordConfirm и password, я искал повсюду, но не смог найти, как добавить пользовательскую проверку в этом случае. Итак, как мне добавить пользовательскую проверку для других полей?

Действие моего контроллера выглядит так

@RequestMapping(value = "/password-change/{id}-{tokenNumber}", method = RequestMethod.POST)
public String changePassword(@PathVariable String id, @PathVariable String tokenNumber, @Valid PasswordResetForm form, BindingResult formBinding, Model model) {

    if (formBinding.hasErrors())
        return "change-password";

    //Other stuff
}

person Eddard Stark    schedule 15.03.2016    source источник


Ответы (3)


Для ваших нужд вы можете рассмотреть возможность создания пользовательского @Constraint. Сначала вы должны создать аннотацию ограничения:

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyConstraintValidator.class)
public @interface MyConstraint {
}

And then the constraint validator:

import javax.validation.ConstraintValidator;

public class MyConstraintValidator implements ConstraintValidator {

    @Autowired;
    private Foo aDependency;
    ...
}

Вы можете найти дополнительную ссылку для этого здесь: JSR-303 Constraint Validator с Spring не работает

И в Spring Docs:

http://docs.spring.io/autorepo/docs/spring/3.2.x/spring-framework-reference/html/validation.html

person pczeus    schedule 15.03.2016

или если вы хотите просто проверить только этот случай (passwordConfirm и password равны).

вы можете использовать @AssertTrue.

@AssertTrue
public boolean isDifferentPass() {
    return !password.equals(passwordConfirm);
}

если эти два поля одинаковы, то BindingResult вашего контроллера имеет ошибку

person Javvano    schedule 15.03.2016
comment
@AssertTrue@AssertFalse) у меня работает! В любом случае, я рекомендую изменить это выражение на более простое (чтобы в вашем выражении было много ненужных логических цепочек): @AssertTrue public boolean isEqualPass() { return password.equals(passwordConfirm); } - person Mariano Ruiz; 27.06.2016
comment
Еще один совет для этого: чтобы настроить сообщение об ошибке для отображения пользователю, просто используйте свойство message аннотации: @AssertTrue(message = "Passwords doesn't match"), и если в вашем проекте Spring настроен i18n, вы можете локализовать сообщение в файле messages_xx.properties с помощью ключа УтверждениеИстина + . + [имя Java-компонента метода проверки]. В приведенном выше примере ключ/значение будет: AssertTrue.equalPass=Passwords doesn't match - person Mariano Ruiz; 27.08.2016

Вы можете использовать аннотацию @Validated для принудительной проверки @RequestParam и @PathVariable. @Valid предназначен для принудительной проверки @RequestBody.

person haykart    schedule 08.11.2017