Spring @Valid не работает должным образом в контроллере Post (из нескольких частей) - PullRequest
0 голосов
/ 06 мая 2018

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

Field error in object 'employee' on field 'details.name': rejected value []; codes [Size.employee.details.name,Size.details.name,Size.name,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [employee.details.name,details.name]; arguments []; default message [details.name],20,1]; default message [*Must be between 1 and 20 letters]
Field error in object 'employee' on field 'details.lastName': rejected value []; codes [NotBlank.employee.details.lastName,NotBlank.details.lastName,NotBlank.lastName,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [employee.details.lastName,details.lastName]; arguments []; default message [details.lastName]]; default message [*Please provide a valid last name]
Field error in object 'employee' on field 'details.name': rejected value []; codes [NotBlank.employee.details.name,NotBlank.details.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [employee.details.name,details.name]; arguments []; default message [details.name]]; default message [*Please provide a valid first name]
Field error in object 'employee' on field 'jobOccupation': rejected value []; codes [NotBlank.employee.jobOccupation,NotBlank.jobOccupation,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [employee.jobOccupation,jobOccupation]; arguments []; default message [jobOccupation]]; default message [*Employee must have an occupation]
Field error in object 'employee' on field 'details.lastName': rejected value []; codes [Size.employee.details.lastName,Size.details.lastName,Size.lastName,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [employee.details.lastName,details.lastName]; arguments []; default message [details.lastName],20,1]; default message [*Must be between 1 and 20 letters]

Если все поля заполнены (за исключением изображения, поскольку оно не имеет ограничений) Все работает нормально, но мне нужна эта проверка.

Это моя форма

<form class="mar-clearfix"  th:action="@{/admin/staff/create/employee}" id="emp-form"
                                    th:object="${employee}" enctype="multipart/form-data"
                                     method="post">
                                        <div class="col s12 xl6">
                                            <div class="field-wrapper">
                                            <p th:if="${#fields.hasErrors('details.name')}" th:errors="*{details.name}" class="error"></p>
                                                <div class="input-field">
                                                    <input type="text" th:field="*{details.name}" id="emp-f-name">
                                                    <label for="emp-f-name">First Name</label>
                                                </div>
                                            </div>
                                            <div class="field-wrapper">
                                            <p th:if="${#fields.hasErrors('details.lastName')}" th:errors="*{details.lastName}" class="error"></p>
                                                <div class="input-field">
                                                    <input type="text" th:field="*{details.lastName}" id="emp-l-name">
                                                    <label for="emp-l-name">Last Name</label>
                                                </div>
                                            </div>
                                            <div class="field-wrapper">
                                                <div class="input-field">
                                                    <input type="email" th:field="*{email}" id="emp-email">
                                                    <label for="emp-email">Email</label>
                                                </div>
                                            </div>
                                            <div class="field-wrapper">
                                                <div class="input-field">
                                                    <label for="emp-birthday">Birthday</label>
                                                    <input type="text" id="emp-birthday" th:field="*{details.dateOfBirth}" class="datepicker">
                                                </div>
                                            </div>
                                        </div>
                                        <div class="col s12 xl6">
                                            <div class="field-wrapper">
                                            <p th:if="${#fields.hasErrors('jobOccupation')}" th:errors="*{jobOccupation}" class="error"></p>
                                                <div class="input-field">
                                                    <input type="text" th:field="*{jobOccupation}" id="emp-job">
                                                    <label for="emp-job">Job Ocupation</label>
                                                </div>
                                            </div>
                                            <div class="field-wrapper">
                                                <div class="input-field">
                                                    <select th:field="*{details.gender}">
                                                        <option th:value="${T(com.mypackage.Genders).MALE}">Male</option>
                                                        <option th:value="${T(com.mypackage.Genders).FEMALE}">Female</option>
                                                    </select>
                                                </div>
                                            </div>
                                            <div class="field-wrapper" style="margin-top:23px">
                                                <div class="input-field">
                                                    <select th:field="*{roles}" multiple>
                                                        <option th:value="null" disabled selected>Select roles</option>
                                                      <option th:each="item : ${roles}"  th:value="${{item}}" 
                                    th:text="${item.role}" ></option>
                                                    </select>
                                                </div>
                                            </div>
                                            <div class="field-wrapper" style="margin-top:23px">
                                                <div class="file-field input-field">
                                                    <div class="btn">
                                                        <span>Profile img</span>
                                                        <input type="file" name="image">
                                                    </div>
                                                    <div class="file-path-wrapper">
                                                        <input class="file-path validate" type="text">
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    </form>

Метод контроллера

@PostMapping(value = "/admin/staff/create/employee")
        public ModelAndView createEmployee(@ModelAttribute ("employee") @Valid Employee employee
                ,@RequestPart("image")MultipartFile image, BindingResult result) {
            ModelAndView mav = new ModelAndView();
            mav.setViewName("admin/admin_layout");
            mav.addObject("page", "employee_create");
            mav.addObject("roles",service.getEmployeeRoles());
            System.out.println("saving");
            if(result.hasErrors()) {
                System.out.println("has errors");
                return mav;}}

Я пытался добавить @RequestPart перед @ModelAttribute, но это, похоже, не помогает. Также, когда я удаляю @RequestPart image и enctype из формы, все работает нормально, ошибки правильно записываются в соответствующие поля th: error. У меня вопрос, почему это происходит при попытке загрузить изображение с формой и есть ли способ обойти это? Спасибо.

1 Ответ

0 голосов
/ 06 мая 2018

Запуск проверки внутри метода контроллера с использованием компонента Validator:

public class MyController
    /**
     * The system wide JSR-303 validator, which checks if annotations ({@link NotNull}, {@link NotBlank}, etc. ) are fulfilled.
     */
    @Autowired
    protected Validator validator;

    @PostMapping(value = "/admin/staff/create/employee")
    public ModelAndView createEmployee(@ModelAttribute ("employee") Employee employee, @RequestPart("image")MultipartFile image, BindingResult result) {

        validator.validate(employee, result);

        ModelAndView mav = new ModelAndView();
        mav.setViewName("admin/admin_layout");
        ...
        if (result.hasErrors()) {
            System.out.println("has errors");
            return mav;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...