Исключение проверки Springboot: org.springframework.validation.BeanPropertyBindingResult Exception

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

Вот мой код:

@RequestMapping(value = "/register", method = RequestMethod.POST)
    public String saveForm(@Valid Users users,Model model,Errors errors) {
        if (errors.hasErrors()) {
            return "registerPage";
        }
        else {
            model.addAttribute("message","Registered................");
        System.out.println("Save Users TEST------------------------------------>");
        userRepository.save(users);

        return "register-success";
        }


    }

Вот исключение:

Field error in object 'users' on field 'salary': rejected value [null]; codes [NotNull.users.salary,NotNull.salary,NotNull.java.lang.Integer,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [users.salary,salary]; arguments []; default message [salary]]; default message [must not be null] Field error in object 'users' on field 'dept': rejected value []; codes [Size.users.dept,Size.dept,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [users.dept,dept]; arguments []; default message [dept],10,2]; default message [Length should be in between 2 to 10] Field error in object 'users' on field 'name': rejected value []; codes [Size.users.name,Size.name,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [users.name,name]; arguments []; default message [name],30,2]; default message [Length should be in between 2 to 30]]

Вот мой пользователь Pojo:

public class Users implements Serializable{

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;
    @Column(name = "name")
    @NotNull
    @Size(min=2,max=30,message = "Length should be in between 2 to 30")
    private String name;

    @Column(name = "salary")
    @NotNull
    private Integer salary;
    @Column(name = "dept")
    @NotNull
    @Size(min=2,max=10,message = "Length should be in between 2 to 10")
    private String dept;

    ....

    }

Вот моя html-форма (с использованием тимелеафа):

<h1 th:text = "${message}" align = "center"></h1>
<div class = "container">
    <h2>Registration form</h2>
      <form class = "form-horizontal" th:object = "${registerCommand}" th:action = "@{/rest/users/register}" method = "post">
        <div class = "form-group">
            <label for = "name">Username:</label>
             <input type = "text"
                class = "form-control" id = "name" placeholder = "Enter Name"
                name = "name" th:field = "*{name}"> <br />
            <p th:if = "${#fields.hasErrors('name')}" th:errors = "*{name}" th:field = "*{name}"
                class = "alert alert-danger"></p>
        </div>
        <div class = "form-group">
            <label for = "dept">Department:</label>
             <input type = "text"
                class = "form-control" id = "dept" placeholder = "Enter Department"
                name = "dept" th:field = "*{dept}"> <br />
            <p th:if = "${#fields.hasErrors('dept')}" th:errors = "*{dept}" th:field = "*{dept}"
                class = "alert alert-danger"></p>
        </div>
        <div class = "form-group">
            <label for = "salary">Salary:</label> <input type = "text"
                class = "form-control" id = "salary" placeholder = "Enter salary"
                name = "salary" th:field = "*{salary}"> <br />
            <p th:if = "${#fields.hasErrors('salary')}" th:errors = "*{salary}" th:field = "*{salary}"
                class = "alert alert-danger"></p>
        </div>

        <button type = "submit" class = "btn btn-sucess">Submit</button>
    </form>
</div>
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Валидация полей ввода для базовой формы React
Валидация полей ввода для базовой формы React
В одном из моих проектов MERN Stack есть форма с именем, фамилией, контактным номером, адресом, электронной почтой, датой рождения, номером NIC, весом...
Пользовательские правила валидации в Laravel
Пользовательские правила валидации в Laravel
Если вы хотите создать свое собственное правило валидации, Laravel предоставляет возможность сделать это. Создайте правило с помощью следующей...
1
0
5 292
3

Ответы 3

Поле 'зарплата' на объекте Пользователь может быть пустым

Я передаю пустые значения через свою форму, но пустые значения не должны приниматься формой. Вместо этого под полями формы отображается сообщение типа «Длина должна быть от 2 до 10».

Shashwat Tyagi 16.11.2018 11:56

Проверьте, какие данные вы передаете в пользовательский объект при его сохранении, возможно, значение зарплаты равно нулю. Поскольку вы использовали @valid для пользователей, он не будет принимать нулевое или пустое значение в данных входного запроса.

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

Shashwat Tyagi 16.11.2018 12:01

Вам необходимо обработать это исключение, чтобы отобразить сообщение об ошибке в форме. Пример: @ExceptionHandler (MethodArgumentNotValidException.cl‌ ass) public ResponseEntity handleMethodArgumentNotValidException (ошибка MethodArgumentNotValidException) {return parseErrors (error.getBindingResult ()); }

Priyanka 16.11.2018 12:13

Нашел свою причину, я не передавал правильные параметры в моем контроллере saveForm-

@RequestMapping(value = "/register", method = RequestMethod.POST)
    public String saveForm(@ModelAttribute("registerCommand") @Valid Users users, BindingResult bindingResult, Model model){

        if (bindingResult.hasErrors()) {

            return "registerPage";
        }
        else {
        userRepository.save(users);
        return "register-success";
        }
    }

Примечание. Если вы используете BindingResult, он должен располагаться сразу после bean-компонента.

Порядок имеет значение только для BindingResult. Он должен следовать за bean-компонентом, который проверяется, чтобы Spring знал, куда помещать любые ошибки проверки.

Благодаря ответу Дэвида Лавендера https://stackoverflow.com/a/29075342/6547517

Большое спасибо, мой друг, я провел несколько часов с этим дерьмом !!! Не могу поверить !!!

sTx 22.06.2020 01:56

Добро пожаловать, рады помочь

Shashwat Tyagi 03.07.2020 13:58

Другие вопросы по теме