参考这篇文章里面的几种异常形式:
全局异常处理是个比较重要的功能,一般在项目里都会用到。
大概把一次请求分成三个阶段,来分别进行全局的异常处理。
一:在进入Controller之前,譬如请求一个不存在的地址,404错误。
二:在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误。
三:以上都正常时,在controller里执行逻辑代码时出的异常。譬如NullPointerException。
http://blog.csdn.net/tianyaleixiaowu/article/details/70145251
直接将编写的全局异常处理类放入项目中,配置@Controller将类载入spring中即可使用,不需要任何配置。
以下是我写的异常处理类:
1package com.archibladwitwicke.springboot2.chapter03.controller; 2 3import com.fasterxml.jackson.databind.ObjectMapper; 4import org.apache.commons.logging.Log; 5import org.apache.commons.logging.LogFactory; 6import org.springframework.beans.factory.annotation.Autowired; 7import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController; 8import org.springframework.boot.web.servlet.error.DefaultErrorAttributes; 9import org.springframework.stereotype.Controller; 10import org.springframework.web.bind.annotation.RequestMapping; 11import org.springframework.web.servlet.ModelAndView; 12 13import javax.servlet.ServletException; 14import javax.servlet.http.HttpServletRequest; 15import javax.servlet.http.HttpServletResponse; 16import java.io.IOException; 17import java.util.Collections; 18import java.util.HashMap; 19import java.util.Map; 20 21@Controller 22public class GlobalErrorController extends AbstractErrorController { 23 private static final String ERROR_PATH = "/error"; 24 private Log log = LogFactory.getLog(GlobalErrorController.class); 25 26 @Autowired 27 ObjectMapper objectMapper; 28 29 public GlobalErrorController() { 30 super(new DefaultErrorAttributes()); 31 } 32 33 @RequestMapping(ERROR_PATH) 34 public ModelAndView getErrorPath(HttpServletRequest request, HttpServletResponse response) { 35 Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes( 36 request, false)); 37 Throwable cause = getCause(request); 38 int status = (Integer) model.get("status"); 39 //错误信息 40 String message = (String) model.get("message"); 41 //友好提示 42 String errorMessage = getErrorMessage(cause); 43 44 String requestPath = (String) model.get("path"); 45 46 47 //后台打印日志信息方方便查错 48 log.info(status + ":" + message, cause); 49 log.info("requestPath---" + ":" + requestPath); 50 51 //后台打印日志信息方方便查错 52 log.info(message, cause); 53 response.setStatus(status); 54 if (!isJsonRequest(request, model)) { 55 ModelAndView view = new ModelAndView("/error.btl"); 56 view.addAllObjects(model); 57 view.addObject("status", status); 58 view.addObject("errorMessage", errorMessage); 59 view.addObject("cause", cause); 60 return view; 61 62 } else { 63 Map<String, Object> error = new HashMap<>(); 64 error.put("success", false); 65 error.put("errorMessage", getErrorMessage(cause)); 66 error.put("message", message); 67 writeJson(response, error); 68 return null; 69 } 70 71 72 } 73 74 private boolean isJsonRequest(HttpServletRequest request, Map<String, Object> model) { 75 // 修复bug,在此类中,使用request无法获取requestPath 76 String requestPath = (String) model.get("path"); 77 if (requestPath.endsWith(".json")) { 78 return true; 79 } else { 80 return (request.getHeader("accept").contains("application/json") || (request.getHeader("X-Requested-With") != null 81 && request.getHeader("X-Requested-With").contains("XMLHttpRequest"))); 82 } 83 } 84 85 private void writeJson(HttpServletResponse response, Map<?, ?> error) { 86 response.setContentType("application/json;charset=utf-8"); 87 try { 88 response.getWriter().write(objectMapper.writeValueAsString(error)); 89 } catch (IOException e) { 90 e.printStackTrace(); 91 } 92 } 93 94 private String getErrorMessage(Throwable ex) { 95 /*不给前端显示详细错误*/ 96 return "服务器错误,请联系管理员"; 97 } 98 99 private Throwable getCause(HttpServletRequest request) { 100 Throwable error = (Throwable) request.getAttribute("javax.servlet.error.exception"); 101 if (error != null) { 102 while (error instanceof ServletException && error.getCause() != null) { 103 error = ((ServletException) error).getCause(); 104 } 105 } 106 return error; 107 } 108 109 @Override 110 public String getErrorPath() { 111 return ERROR_PATH; 112 } 113}
可以根据项目具体修改这个方法,将判断ajax请求的种类进行完善,其余的部分可以不用修改:
1private boolean isJsonRequest(HttpServletRequest request, Map<String, Object> model) { 2 // 修复bug,在此类中,使用request无法获取requestPath 3 String requestPath = (String) model.get("path"); 4 if (requestPath.endsWith(".json")) { 5 return true; 6 } else { 7 return (request.getHeader("accept").contains("application/json") || (request.getHeader("X-Requested-With") != null 8 && request.getHeader("X-Requested-With").contains("XMLHttpRequest"))); 9 } 10 }
此异常类可以对上述三种异常情况进行拦截处理,显示自定义的异常处理页面或异常处理数据。