我想在我的项目中定义一个常见的异常管理器,所以我使用@ControllerAdvice来做,代码片段如下:
@ExceptionHandler(Exception.class)
public ModelAndView handleAllException(HttpServletRequest request, Exception ex) throws Exception
{
LOGGER.error(ex.getMessage());
ModelAndView mav = new ModelAndView();
mav.addObject("exception", ex);
mav.addObject("url", request.getRequestURL());
mav.setViewName(ViewConstants.INTERNAL_ERROR_VIEW);
return mav;
}
它将返回一个常见的错误页面。这对于正常的请求异常非常有用。但如果这是一个Ajax请求,结果是如此丑陋。所以我添加代码来判断它。添加的代码如下:
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
// return HTTP Status code and response message
} else {
// return error page name
}
我不认为这是最好的方式,任何人都有好的意见吗?
答案 0 :(得分:1)
我将所有控制器都放在不同的包中,具体取决于它们是否提供AJAX请求。然后我可以在ControllerAdvice注释上设置#basePackages元素来相应地处理异常
<强>更新强> 请参阅RequestMapping#params和RequestMapping#headers,根据标题和/或参数
分隔控制器答案 1 :(得分:0)
我建议在任何请求上设置错误响应代码,认为这是一个很好的做法,通知客户端出现问题,而不是取决于请求的类型。对于ajax请求,您可以返回相同的页面并通过错误代码识别问题。
答案 2 :(得分:0)
如果使用jQuery发出请求,可以使用以下命令:
jQuery.ajaxSetup({
headers: { 'ajax-request': true },
statusCode: {
400: function (xhr) {
...do something
},
500: function (xhr) {
...do something
}
...
}
});
答案 3 :(得分:0)
...
public class Application extends SpringBootServletInitializer {
@Bean(name = "simpleMappingExceptionResolver")
public SimpleMappingExceptionResolver createSimpleMappingExceptionResolver() {
SimpleMappingExceptionResolver r = new SimpleMappingExceptionResolver();
r.setDefaultErrorView("forward:/errorController");
return r;
}
@Controller
public class ErrorController {
public static final Logger LOG = Logger.getLogger(ErrorController.class);
@RequestMapping(value = "/errorController")
public ModelAndView handleError(HttpServletRequest request,
@RequestAttribute("exception") Throwable th) {
ModelAndView mv = null;
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
if (isBusinessException(th)) {
mv = new ModelAndView("appAjaxBadRequest");
mv.setStatus(BAD_REQUEST);
} else {
LOG.error("Internal server error while processing AJAX call.", th);
mv = new ModelAndView("appAjaxInternalServerError");
mv.setStatus(INTERNAL_SERVER_ERROR);
}
mv.addObject("message", getUserFriendlyErrorMessage(th).replaceAll("\r?\n", "<br/>"));
} else {
LOG.error("Cannot process http request.", th);
mv = new ModelAndView("appErrorPage");
mv.addObject("exeption", th);
}
return mv;
}
}