自定义异常
自定义Exception
定义一个Excpetion在发生错误的时候抛出,然后被异常处理类处理转发到对应异常页面
/** * 自定义异常类 */ public class TestException extends RuntimeException { public TestException() { } public TestException(String message) { super(message); } public TestException fail(String message) { throw new TestException(message); } }
前端异常页面
因为主要的目的是跳转 所以随便写几个显示错误的页面
Controller层异常处理
import com.newbee.mall.util.Result; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; @RestControllerAdvice public class TestHandlerController { //该注解表示这个方法可以处理所有的异常 @ExceptionHandler(Exception.class) public Object handlerException(HttpServletRequest request, Exception e) { //自定义结果集Result Result result = new Result(); result.setResultCode(500); //判断是否为自定义异常 if (e instanceof TestException) { result.setMessage(e.getMessage()); } else { e.printStackTrace(); result.setMessage("未知异常!请联系管理员!"); } //检查请求是否为ajax, 如果是 ajax 请求则返回 Result json串, 如果不是 ajax 请求则返回 error 视图 String contentTypeHeader = request.getHeader("Content-Type"); String acceptHeader = request.getHeader("Accept"); String xRequestedWith = request.getHeader("X-Requested-With"); if ((contentTypeHeader != null && contentTypeHeader.contains("application/json")) || (acceptHeader != null && acceptHeader.contains("application/json")) || "XMLHttpRequest".equalsIgnoreCase(xRequestedWith)) { return result; } else { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message", e.getMessage()); modelAndView.addObject("url", request.getRequestURL()); modelAndView.addObject("stackTrace", e.getStackTrace()); modelAndView.setViewName("error/error"); return modelAndView; } } }
所有访问到Controller请求的异常都会被处理,如果是ajax请求就返回Json对象,如果不是ajax请求就跳转到error页面,显示出异常信息
全局异常处理
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.error.ErrorAttributes; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import java.util.Map; @Controller public class ErrorPageController implements ErrorController { private static ErrorPageController errorPageController; @Autowired private ErrorAttributes errorAttributes; private final static String ERROR_PATH = "/error"; public ErrorPageController(ErrorAttributes errorAttributes) { this.errorAttributes = errorAttributes; } public ErrorPageController() { if (errorPageController == null) { errorPageController = new ErrorPageController(errorAttributes); } } @RequestMapping(value = ERROR_PATH, produces = "text/html") public ModelAndView errorHtml(HttpServletRequest request) { HttpStatus status = getStatus(request); if (HttpStatus.BAD_REQUEST == status) { return new ModelAndView("error/error_400"); } else if (HttpStatus.NOT_FOUND == status) { return new ModelAndView("error/error_404"); } else { return new ModelAndView("error/error_5xx"); } } @RequestMapping(value = ERROR_PATH) @ResponseBody public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) { Map<String, Object> body = getErrorAttributes(request, getTraceParameter(request)); HttpStatus status = getStatus(request); return new ResponseEntity<Map<String, Object>>(body, status); } @Override public String getErrorPath() { return ERROR_PATH; } private boolean getTraceParameter(HttpServletRequest request) { String parameter = request.getParameter("trace"); if (parameter == null) { return false; } return !"false".equals(parameter.toLowerCase()); } protected Map<String, Object> getErrorAttributes(HttpServletRequest request, boolean includeStackTrace) { WebRequest webRequest = new ServletWebRequest(request); return this.errorAttributes.getErrorAttributes(webRequest, includeStackTrace); } private HttpStatus getStatus(HttpServletRequest request) { Integer statusCode = (Integer) request .getAttribute("javax.servlet.error.status_code"); if (statusCode != null) { try { return HttpStatus.valueOf(statusCode); } catch (Exception ex) { } } return HttpStatus.INTERNAL_SERVER_ERROR; } }
除了访问controller之外的所有异常都会被处理 根据httpStatusCode来判断是哪种异常并跳转到对应页面