У меня есть контроллер, который использует весеннюю проверку боба для проверки входных значений, например, чтобы сохранить тему:Spring ExceptionHandler доступ к модели?
public String save(@ModelAttribute("topic") @Valid Topic topic
Это работает хорошо.
В моем слое данных я также использую проверку бина и когда что-то недействительное отправляется на слой данных, генерируется исключение ConstraintViolationException. Я поймаю это в своем контроллере с помощью обработчика исключения:
@ExceptionHandler({ ConstraintViolationException.class })
public ModelAndView handleValidationException(HttpServletRequest req,ConstraintViolationException e) {
Это также хорошо работает.
Проблема я столкнулся это я не могу получить доступ к модели в моем ExceptionHandler, Документах ясно говорит об этом:
Important Note: the Model may not be a parameter of any @ExceptionHandler method.
Доступ к модели необходим, потому что я хочу, чтобы показать пользователю представление с формой, которую он только что заполнил. Но поскольку я не могу получить доступ к модели, я не могу получить заполненные данные формы.
Одно решение, которое я нашел, ломает ConstraintViolationException в моем методе save(), потому что здесь у меня есть доступ к модели.
Но я бы предпочел универсальное решение и не имел беспорядочную попытку/улов/наконец, когда мне нужно что-то сохранить в базе данных.
Кто-нибудь знает хорошее решение?
[править] Вот мой текущий обработчик исключений:
@ExceptionHandler({ ConstraintViolationException.class })
public ModelAndView handleValidationException(HttpServletRequest req,ConstraintViolationException e) {
log.debug("handleValidationException");
//no access to model, so i create new one, but this new one doesn't have the values the user entered in the html form.
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.setViewName("add_topc");
return mav;
}
Можем ли мы увидеть, что ваш '@ ExceptionHandler' делает? Объект 'Тема' уже должен находиться в модели. –
Я добавил обработчик исключений к вопросу.Как написано в документах и отмечено в моем вопросе «Модель не может быть параметром любого метода @ExceptionHandler». Если я понимаю, что объект Topic недоступен в обработчике исключения, то модель, содержащая объект Topic, недоступна в обработчике исключений. – TinusSky
Есть ли что-нибудь, что вы хотите сделать для фактического объекта 'Тема'? «ModelAndView», который вы возвращаете из '@ ExceptionHandler', будет объединен с« Моделью », которую использовал ваш обработчик' @ Controller'. –