Изменить и вернуть объект ModelAttribute, если проверка не удалась - PullRequest
1 голос
/ 03 мая 2020

У меня есть простая сущность ...

@Entity
public class WatchedDirectory {
    @Column(nullable=false)
    @NotBlank(message="Filesystem path CANNOT be empty")
    String filesystemPath;
}

... и конечная точка GET для создания одной ...

    @GetMapping("/add")
    public String add(@ModelAttribute WatchedDirectory watchedDirectory) {
        return "mng-dir-add";
    }

..., которая показывает форму, созданную в Thymeleaf, с проверкой ошибок и все. Как только вы нажмете кнопку sumbmit, данные перейдут в конечную точку POST ...

    @PostMapping("/add")
    public String addExecute(@Valid @ModelAttribute WatchedDirectory watchedDirectory, BindingResult result, RedirectAttributes redirect, Model model) {
        if(result.hasErrors()) {
            // here I want to iterate through
            // errors and clean erroneous fields
            return "mng-dir-add";
        }
        watchedDirectory = fs.persistDirectory(watchedDirectory);
        redirect.addFlashAttribute("added", watchedDirectory);
        return "redirect:/list";
    }

... и все будет хорошо и модно. Когда данные действительны, они сохраняются и выдается перенаправление в список (POST / Redirect / GET). Когда данные недействительны, заполняются поля ошибок thymeleaf, и я перечисляю сообщения об ошибках под соответствующими полями.

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

То, что я до сих пор пробовал: изменение параметра @ModelAttribute, установка атрибутов в Model, установка атрибутов в RedirectAttributes. Каждый раз, когда я получаю одни и те же данные, предоставленные пользователем без каких-либо изменений в форме вывода, по какой-то причине я ничего не могу изменить. Я попытался также перенаправить на метод GET, но кажется, что он очищает сланец, что мне не нужно.

Если кому-то интересно, то как выглядит форма в тимелист:

        <form id="content" action="#" th:action="@{/add}" th:object="${watchedDirectory}" method="post" class="was-validated">
            <div class="form-group has-feedback has-error">
                <label for="filesystemPath">Filesystem path:</label>
                <input th:field="*{filesystemPath}" type="text" id="filesystemPath" name="filesystemPath" class="form-control" placeholder="~/" required />
                <label th:if="${#fields.hasErrors('filesystemPath')}" th:errors="*{filesystemPath}"></label>
            </div>          
            <button type="submit" class="btn btn-outline-success">Save</button>
        </form>

* Атрибут 1022 * в поле ввода закроется, если будет предоставлен пробел, но при проверке Spring появится сообщение об ошибке. Очистка этого поля и возврат его пользователю сделает вещи более последовательными, чем показ смешанных сигналов, таких как: html5 and spring showing their errors

Любая помощь будет очень признательна.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Вам необходимо определить BeanPropertyBindingResult объект, который предоставляет поля с ошибками. Затем сделайте модель с такими результатами,

@PostMapping( "/add" )
public String addExecute( @Valid @ModelAttribute WatchedDirectory watchedDirectory, BindingResult result, RedirectAttributes redirect, Model model )
{
    if( result.hasErrors() )
    {
        BeanPropertyBindingResult result2 = new BeanPropertyBindingResult( watchedDirectory, theBindingResult.getObjectName() );
        for( ObjectError error : theBindingResult.getGlobalErrors() )
        {
            result2.addError( error );
        }
        for( FieldError error : theBindingResult.getFieldErrors() )
        {
            result2.addError( new FieldError( error.getObjectName(), error.getField(), null, error.isBindingFailure(), error.getCodes(), error.getArguments(), error.getDefaultMessage() ) );
        }

        model.addAllAttributes( result2.getModel() );
        return "mng-dir-add";
    }
    watchedDirectory = fs.persistDirectory( watchedDirectory );
    redirect.addFlashAttribute( "added", watchedDirectory );
    return "redirect:/list";
}
0 голосов
/ 03 мая 2020

В соответствии с Проверка с использованием интерфейса валидатора Spring из Документации Spring Framework :

Интерфейс Validator работает с использованием объекта Errors, поэтому при проверке валидаторы могут сообщать об ошибках проверки объекту Errors.

validate(Object, org.springframework.validation.Errors): проверяет указанный объект и, в случае ошибки проверки, регистрирует ошибки с данным объектом Errors.

И интерфейс Errors не предоставляет API для отмены регистрации ошибок привязки .

Итак, кажется, Spring не предоставлен способ достичь того, что вы хотите.

...