我正在尝试处理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;
}
}
答案 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文件(我不知道为什么...)