1 场景描述:
在平常的项目开发中,经常会看到一些有意思的事情。比如: 请求一个接口数据时,返回的数据是一大堆看不懂的英文串串。没错,就是各种异常。难道猿猿们没有想过,自己都不愿意看到的串串,让前端看、让操作人员看???
所以,一名伟大的猿,应该学会打碎牙,往肚子里咽。其它人看到的只是友好的笑脸。
此时,全局异常控制,你值得拥有!
2 项目架构描述:
项目框架: SpringBoot
2.1 使用的注解:
@ControllerAdvice
参数 basePackages 控制异常的范围;
@ExceptionHandler
@ControllerAdvice
示例:
package com.ndx.config.Intercepter;
import javax.servlet.http.HttpServletResponse;
import com.ndx.config.exception.ErrorPageException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ndx.common.ServerResponse;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@ControllerAdvice(basePackages={"com.ndx.controller"})
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public ServerResponse<String> exceptionHandler(RuntimeException e, HttpServletResponse response) {
log.error("全局检测到异常:",e);
return ServerResponse.createByErrorMessage("内部错误!");
}
@ExceptionHandler(IndexOutOfBoundsException.class)
@ResponseBody
public ServerResponse<String> exceptionHandler(IndexOutOfBoundsException e, HttpServletResponse response) {
log.error("全局拦截 Cotroller 数组越界异常:", e);
return ServerResponse.createByErrorMessage("数组越界错误!");
}
@ExceptionHandler(NullPointerException.class)
@ResponseBody
public ServerResponse<String> exceptionHandler(NullPointerException e, HttpServletResponse response) {
log.error("全局拦截 Cotroller 空指针异常:", e);
return ServerResponse.createByErrorMessage("空指针异常误!");
}
/**
* 处理自定义异常
* 如果某些业务处理,当数据返回错误时,
* 需要跳转页面,可以在这里封装好数据信息
* 提供给前端
*/
@ExceptionHandler(ErrorPageException.class)
@ResponseBody
public ServerResponse exceptionHandler(ErrorPageException e, HttpServletResponse response) {
log.error("全局拦截 Cotroller 错误页面异常:", e);
Map<String,String> map = new HashMap<>();
map.put("url","/error.html");
map.put("msg","休息,休息~~~~~~");
return ServerResponse.createByErrorCodeMessage(10,"error",map);
}
}
2.2 实现 HandlerExceptionResolver 接口:
package com.ndx.config.Intercepter;
import com.ndx.common.ResponseCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @auth zhangmj
* @date 2019/1/19 3:08
*/
@Slf4j
@Component
public class ExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
log.error("{} Exception",httpServletRequest.getRequestURI(),e);
ModelAndView modelAndView = new ModelAndView(new MappingJackson2JsonView());
modelAndView.addObject("status", ResponseCode.ERROR.getCode());
modelAndView.addObject("msg","接口异常,详情请查看日志信息");
modelAndView.addObject("data",e.toString());
return modelAndView;
}
}
2.3 区别
注解 ExceptionHandler 优先级别高于 HandlerExceptionResolver 接口;
注解使用起来,更见简洁,配置更加方便;
…
…