Ситуация
Я пытаюсь сгруппировать код, который регистрирует исключения и визуализирует прекрасный вид несколькими способами. В настоящий момент логика когда-то находится в самом @RequestHandler
(в блоке catch), othertimes делегируется классу утилиты (который работает, но отводит логику от места, где генерируется исключение).
Spring @ExceptionHandler
представлял собой способ группировать все в одном месте (сам контроллер или родительский элемент) и избавляться от некоторого кода (нет необходимости ставить логику в try-catch и нет необходимости в классе утилиты)... пока я не понял, что методы @ExceptionHandler
не будут иметь параметры ModelMap
или BindingResult
. В настоящее время эти объекты используются для визуализации представления с разумным сообщением об ошибке, и мы также хотим зарегистрировать некоторую информацию, содержащуюся в этих объектах.
Вопрос
Почему Spring не поддерживает аргументы метода ModelMap
или BindingResult
для @ExceptionHandler
? В чем причина этого?
Возможное решение
В исходном коде Spring (3.0.5) аргументы для метода разрешены в HandlerMethodInvoker.invokeHandlerMethod
. Исключение, отправленное обработчиком запроса, попадает туда и повторно бросается. Параметры @ExceptionHandler
и его параметры разрешены в другом месте. В качестве обходного пути я решил проверить, реализует ли Exception гипотетический интерфейс ModelAware или BindingResultAware и в этом случае устанавливает атрибуты Model и BindingResult перед повторным запуском.
Как это звучит?