Мне тоже это интересно.
Для того, чтобы обрабатывать проверку bean-компонентов таким образом, чтобы представление неглобальной ошибки отображало любые ConstraintViolationException
s, которые могут быть выброшены, я выбрал решение в соответствии с тем, что предложил @Stefan Haberl:
Явно поймайте исключение, чтобы сообщить Spring MVC, что вы знаете, что делаете (вы можете использовать шаблон Template для рефакторинга логики обработки исключений в одном месте)
Я создал простой Action
интерфейс:
public interface Action {
String run();
}
И класс ActionRunner
, который обеспечивает правильную обработку ConstraintViolationException
s (в основном сообщения от каждого ConstraintViolationException
простодобавлено в Set
и добавлено в модель):
public class ActionRunner {
public String handleExceptions(Model model, String input, Action action) {
try {
return action.run();
}
catch (RuntimeException rEx) {
Set<String> errors = BeanValidationUtils.getErrorMessagesIfPresent(rEx);
if (!errors.isEmpty()) {
model.addAttribute("errors", errors);
return input;
}
throw rEx;
}
}
}
Java 8 делает это довольно приятным для запуска в методе действия контроллера:
@RequestMapping(value = "/event/save", method = RequestMethod.POST)
public String saveEvent(Event event, Model model, RedirectAttributes redirectAttributes) {
return new ActionRunner().handleExceptions(model, "event/form", () -> {
eventRepository.save(event);
redirectAttributes.addFlashAttribute("messages", "Event saved.");
return "redirect:/events";
});
}
Это завершаетте методы действия, для которых я хотел бы явно обрабатывать исключения, которые могут быть выброшены из-за проверки бина.У меня все еще есть глобальный @ExceptionHandler
, но это касается только исключений "о, дерьмо".