2013-04-23 7 views
1

Я использую Spring 3.2.1 и имею команду PropertyEditorSupport, чтобы заставить параметр, который я хотел бы автоконвертировать в перечисление в верхний регистр, чтобы он преобразовывал неверные параметры. IllegalArgumentException может быть сброшен, если параметр String не может быть преобразован в перечисление. Моя проблема заключается в том, что код состояния возвращается как 500, когда ему должно быть 400. Я создал ResponseEntityExceptionHandler с аннотацией @ControllerAdvice и с помощью метода annotated @ExceptionHandler (IllegalArgumentException.class), намеревающегося установить там код состояния, но метод никогда не вызывается, когда исключение выброшены. Почему нет? Это та же проблема, что обсуждалось здесь, MaxUploadSizeExceededException doesn't invoke the exception handling method in Spring? т.е.ControllerAdvice ExceptionHandler не вызывается из PropertyEditorSupport

»... исключение брошено, прежде чем запрос достиг диспетчерской сервлета. Поэтому ваш ExceptionHandler не называется , потому что в момент исключение целевого контроллера имеет еще предстоит определить «.

Если да, то как я могу вернуть правильный код состояния?

ответ

0

Короткая версия:

Помещенный @ExceptionHandler(Exception) аннотированный метод в @Controller классе.


Longer версия:

Я заметил, что @ExceptionHandler(XxxException.class) аннотированный метод @ControllerAdvice класса будет вызываться только если XxxException происходит «после» ввода метод с согласования @RequestMapping.

Условия, такие как MaxUploadSizeExceededException и MethodArgumentNotValidException, приведут к тому, что SpringMVC НЕ вводит метод @RequestMapping, поэтому совет не применяется.

Моим решением было грустно разместить @ExceptionHandler(XxxException.class) аннотированный метод в классе контроллера. Нехорошо, но работает.

Надеюсь, это поможет. Если кто-то знает о лучшем решении (при использовании @ControllerAdvice), делите.