Я использую аннотацию @ControllerAdvice
для определения исключений на уровне приложения. Теперь проблема в том, что у меня есть два класса @ControllerAdvice
, один для REST и один для обычного веб-приложения. Когда я определяю @ExceptionHandler
для Exception.class
в обоих, рассматривается только первый. Как отделить оба? Или как я могу поймать Исключение и определить, откуда оно произошло? Есть ли способ, или же мне нужно использовать обработчики исключений, специфичные для контроллера?Обработка исключений в Spring MVC вместе с Rest API
ответ
Я решил эту проблему, создав пользовательские исключения для своего приложения и предоставив один метод обработчика исключений для каждого из них с помощью обработчика @exception.
Я также использовал аспекты, чтобы убедиться, что каждое исключение преобразуется в любое из пользовательских исключений.
@Aspect
@Component
public class ExceptionInterceptor {
@AfterThrowing(pointcut = "within(x.y.package..*)", throwing = "t")
public void toRuntimeException(Throwable t)
throws ApplicationException1, ApplicationException2,ApplicationException3 {
if (t instanceof ApplicationException1) {
throw (ApplicationException1) t;
} else if (t instanceof ApplicationException2) {
throw (ApplicationException2) t;
} else
throw (ApplicationException3) t;
}
}
Они передадут управление в @controlleradvice.
Я заметил, что это осталось на месяц или около того, поэтому он может быть старым. Но эта статья может помочь http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/.
Раздел 3.5, вероятно, является тем, что вы ищете, настраиваемым Резолютором Исключения.
Благодарим вас за ответ, но я решил его использовать аспекты, чтобы все исключения были выброшены в одно место. –
Я думаю, что это не объясняет, как выполнять обработку исключений для API REST и HTML-страниц в том же приложении Spring. -1 –
Не могли бы вы объяснить немного больше, что вы здесь делаете? Как это передать управление одному из ваших классов ControllerAdvice? –