Как вернуть объект ModelAndView из класса @ControllerAdvice? - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь обработать исключения из контроллеров Spring MVC, но у меня проблема.

Мой дескриптор возвращает объект ModelAndView, но Spring его не использует.

Во время отладки я увидел, что Spring открыл страницу в браузере со стандартным сообщением об ошибке Spring, а затем запустил мой метод, представленный в GlobalControllerExceptionHandler. Почему он не вызывает этот метод, прежде чем идти к контроллеру?

У меня есть этот код:

@Slf4j
@ControllerAdvice(annotations = Controller.class)
public class GlobalControllerExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) {
        log.warn("Enter to handle method");
        ModelAndView mav = new ModelAndView("exception");
        mav.addObject("errorType", "errorType.toString()");
        mav.addObject("exception", "rootCause");
        mav.addObject("message", e.getMessage());
        return mav;
    }
}

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Сегодня неожиданно это сработало. Я решил проблему со следующими настройками в application.properties:

server.error.whitelabel.enabled=false
spring.mvc.throw-exception-if-no-handler-found=true
server.error.include-exception=true
server.error.path=

Я также создал файл error.html, который используется тимилефом, если ошибка не обнаружена в моем ExceptionHandler (я понятия не имею, почему .. .)

0 голосов
/ 02 ноября 2019

Возможно, проблема в контроллере.

Ваш класс GlobalControllerExceptionHandler правильный.

Пример:

@Slf4j
@ControllerAdvice
public class GlobalControllerExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception e){
        log.warn("Enter to handle method");
        ModelAndView modelAndView = new ModelAndView();
        mav.addObject("errorType", "errorType.toString()");
        modelAndView.addObject("exception", "rootCause");
        modelAndView.addObject("message", e.getMessage());
        modelAndView.setViewName("exception");
        return modelAndView;
    }     
}

@Controller
public class ExampleController { 

    @GetMapping("/get/{someVariable}")
    public String getMethod(@PathVariable("someVariable") int someVariable) throws Exception {
        if(condition){
            // code
        } else {
            throw new Exception(someVariable); // this will be caught by the GlobalControllerExceptionHandler's defaultErrorHandler
        }
        return "default";
    }

}

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...