我们正在开发Spring Boot UI应用程序,因为它是一个UI应用程序,所以我们将ajax调用用于某些操作,以及常规页面调用(仅调用请求映射url)。 这里的问题是,在进行ajax调用以及正常页面调用(如果它被相同类型的异常捕获)时,该如何处理,比如说DataAccessException
@ExceptionHandler(DataAccessException.class)
public ModelAndView handleError(HttpServletRequest req, Exception ex) {
logger.error("Request: " + req.getRequestURL() + " raised " + ex);
ModelAndView mav = new ModelAndView();
mav.addObject("exception", ex);
mav.addObject("url", req.getRequestURL());
mav.setViewName("error");
return mav;
}
此数据访问异常应同时用于ajax请求和常规页面调用,但ajax响应不应是ModelAndView。
答案 0 :(得分:0)
一种方法是确保请求是可区分的,例如所有“正常页面”请求都以.html
结尾,因此它们的错误响应有效负载也应该是HTML页面,例如其他所有请求都将发送带有错误响应的JSON有效负载。
当然,更RESTful的方式将是内容协商,即使是对于错误响应,如果无法协商通用格式,则默认为纯文本。
答案 1 :(得分:0)
我尝试过的以下方法已经成功
@ExceptionHandler(DataAccessException.class)
public Object handleError(HttpServletRequest req, DataAccessException ex) {
logger.error("Request: " + req.getRequestURL() + " raised " + ex);
if("XMLHttpRequest".equals(request.getHeader("X-Requested-With")))
{
ResponseEntity<String> dataExceptionRes=null;
dataExceptionRes=new ResponseEntity<String>(HttpStatus.FORBIDDEN);
return dataExceptionRes;
}
else{
ModelAndView mav = new ModelAndView();
mav.addObject("exception", ex);
mav.addObject("url", req.getRequestURL());
mav.setViewName("error");
return mav;
}
}