package com.haogrgr.test.interceptor; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import org.springframework.web.servlet.view.json.MappingJackson2JsonView; import com.haogrgr.test.exception.BizException; import com.haogrgr.test.pojo.AjaxResult; @ControllerAdvice("com.haogrgr.test.controller") public class ControllerExceptionHandler implements ResponseBodyAdvice<Object> { private static Logger logger = LoggerFactory.getLogger(ControllerExceptionHandler.class); private static final String DEFAULT_ERROR_VIEW = "common/error"; @ExceptionHandler(BizException.class) public ModelAndView handlerBizException(HandlerMethod methde, HttpServletRequest req, BizException e) { logger.error("", e); ModelAndView mav = new ModelAndView(); mav.addObject("type", "业务异常"); mav.addObject("message", e.getMsg()); //ajaxResult mav.addObject("succ", AjaxResult.FAIL_BIZ); mav.addObject("info", e.getMsg()); setView(req, mav); return mav; } @ExceptionHandler(Exception.class) public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) { logger.error("", e); ModelAndView mav = new ModelAndView(); mav.addObject("type", "系统异常"); mav.addObject("message", "服务器内部错误"); //ajaxResult mav.addObject("succ", AjaxResult.FAIL_SYS); mav.addObject("info", "系统异常"); setView(req, mav); return mav; } /** * TODO:这里只是判断了ajax,没有判断是不是需要返回json,可以通过accept头来判断 * 判断是否为ajax请求 */ private boolean isAjaxRequest(HttpServletRequest req) { return "XMLHttpRequest".equalsIgnoreCase(req.getHeader("X-Requested-With")); } /** * 判断是否为ajax请求 */ private void setView(HttpServletRequest req, ModelAndView mav) { if (isAjaxRequest(req)) { mav.setView(new MappingJackson2JsonView()); //{type:"业务异常", message:"e.getMsg()"} } else { mav.setViewName(DEFAULT_ERROR_VIEW); } } @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { //返回true表示拦截,返回false表示不拦截 return true; } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { //这里可以获取到ResponseBody注解方法的结果.可以在结果被转换为json或其他视图前处理,如日志 System.out.println(body); return body; } }