Как отобразить сообщение об ошибке из валидатора Spring? - PullRequest
0 голосов
/ 27 марта 2012

Я потратил много часов на это, поэтому пришло время спросить.

Контроллер

@RequestMapping(value="/articleHeaderEdit/{articleId}", method=RequestMethod.POST)
public ModelAndView submitHeader(@PathVariable Integer articleId, @ModelAttribute("screenObject") ArticleHeaderEditScreenObject articleHeaderEditScreenObject, @ModelAttribute("article") Article article, BindingResult bindingResult, Model model, Locale locale) throws Exception {
    validator.validate(articleHeaderEditScreenObject, bindingResult);

    ModelAndView modelAndView=new ModelAndView();

    if(bindingResult.hasErrors()) {
        initializeScreenObject(articleHeaderEditScreenObject, article, locale);
        modelAndView.setViewName(WebView.ARTICLE_HEADER_EDIT_PAGE.getViewName());

    } else {
        modelAndView.setViewName("redirect:/article/" + articleId);
    }

    return modelAndView;
}   

Validator

@Component
public class ArticleHeaderEditScreenObjectValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return ArticleHeaderEditScreenObject.class.isAssignableFrom(clazz); 
}

@Override
public void validate(Object validatedObject, Errors errors) {
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title", "required.title", "Title is required.");
}

Просмотр (только соответствующий html)

<form:form modelAttribute="screenObject" action="${screenObject.getFormAction()}">

    <form:errors path="*" />

    <form:errors />

    <form:input path="title" />
    <form:errors path="title" />

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

Я вижу, как многие люди борются с этим.Как правило, это тот факт, что атрибут модели имеет другое имя в форме и в контроллере, но в этом случае они совпадают.Есть идеи, чего еще не хватает?

1 Ответ

2 голосов
/ 16 августа 2012

Секрет в порядке параметров, передаваемых методу submitHeader.

В документации Spring четко указано, что аргумент BindingResult bindingResult должен быть записан точно после объекта модели, который вы хотите проверить.

Таким образом, если вы передаете несколько ModelAttributes, тот, имеющий BindingResult после того, как все ошибки будут привязаны к этому объекту.

Так что в вашем случае BindingResult будет иметь ошибки, специфичные для Article объект, а не ArticleHeaderEditScreenObject объект.

Ссылочный комментарий из весенней документации:

Параметры Errors или BindingResult должны следовать за объектом модели, который сразу же связывается каксигнатура метода может иметь более одного объекта модели, и Spring создаст отдельный экземпляр BindingResult для каждого из них, поэтому следующий образец не будет работать:

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#d0e29628

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...