SpringBoot 通用异常处理

404错误

404错误是不经过Controller的,所以使用@ControllerAdvice或@RestControllerAdvice无法获取到404错误

springboot2处理404错误的两种方式

第一种:直接配置
#出现错误时, 直接抛出异常 
spring.mvc.throw-exception-if-no-handler-found=true

比如和swagger集成时,访问/swagger-ui.html会出现404异常

第二种:继承ErrorController来处理错误
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
public class MyErrorController implements ErrorController {

    @RequestMapping("/error")
    public String handleError(HttpServletRequest request){
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if(statusCode == 500){
            return "/error/500";
        }else if(statusCode == 404){
            return "/error/404";
        }
    }


    @Override
    public String getErrorPath() {
        return "/error";
    }
}
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public Object defaultErrorHandler(HttpServletRequest req, HandlerMethod handlerMethod, Throwable ex){
        if(WebUtils.isAjax(handlerMethod)){
            return new ErrorInfo(ErrorInfo.FAILURE_STATUS,"Server exception, please try again later");
        }else {
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.setViewName("/error/500");
            return modelAndView;
        }
    }

    /**
     * @see 后续通过自定义异常使用
     * @param req
     * @param e
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = WmsException.class)
    public ResultVO jsonErrorHandler(HttpServletRequest req, WmsException e) {
        ResultVO resultVO = ResultVO.failure(e.getMessage());
        return resultVO;
    }
}
public class WebUtils extends org.springframework.web.util.WebUtils {
    /**
     * 判断是否ajax请求
     * spring ajax 返回含有 ResponseBody 或者 RestController注解
     * @param handlerMethod HandlerMethod
     * @return 是否ajax请求
     */
    public static boolean isAjax(HandlerMethod handlerMethod) {
        ResponseBody responseBody = handlerMethod.getMethodAnnotation(ResponseBody.class);
        if (null != responseBody) {
            return true;
        }
        // 获取类上面的Annotation,可能包含组合注解,故采用spring的工具类
        Class<?> beanType = handlerMethod.getBeanType();
        responseBody = AnnotationUtils.getAnnotation(beanType, ResponseBody.class);
        if (null != responseBody) {
            return true;
        }
        return false;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。