如何从@ControllerAdvice类返回ModelAndView对象?

时间:2019-11-01 16:27:45

标签: spring spring-mvc

我正在尝试处理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 :(得分:0)

问题可能出在控制器上。

您的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";
    }

}

我希望这会对您有所帮助。

答案 1 :(得分:0)

今天,它突然起作用了。我在application.properties中通过以下设置解决了该问题:

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

如果错误未在ExceptionHandler中捕获,我还创建了一个百里香使用的error.html文件(我不知道为什么...)