springboot-errorhandler

Spring boot

springboot能快速的构建项目,各个模块逻辑很清晰,需要用的引入jar包就能使用,官网的资料也很充足,用起来特别上手。所以之后的小项目基本上都会用springboot框架。

异常处理

springboot默认出现异常返回一个默认的页面,有点丑,而且不能处理ajax异步请求的异常,比方说404。
写这个文章是为了记录下自己学习过程中遇到的问题,做个笔记,顺带分享一下,有问题的欢迎指出来。
这里分享下springboot官网文档的地址:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

文档中指出可以使用多种方式处理异常。这里举两个例子:

@ControllerAdvice

package com.fruitday.controller;

import javax.servlet.http.HttpServletRequest;

import org.jboss.logging.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.NoHandlerFoundException;
/**
 * ControllerAdvice 可通过 annotations(), basePackageClasses(), basePackages() 选择控制器子集
 * annotations=Controller.class  只对声明为Controller的控制器生效。
 * @author cxx
 */
@ControllerAdvice(annotations=Controller.class)
public class ExceptionHandlerController{
static Logger log = Logger.getLogger(ExceptionHandlerController.class);
/**
 * 处理所有抛出来的异常
 * @param ex
 * @param request
 * @return
 */
@ExceptionHandler(Exception.class)
public String handlerAll(Exception ex, HttpServletRequest request) {
     log.error(ex.getMessage(), ex);
    request.setAttribute("errorTips", ex.getMessage());
    request.setAttribute("ex", ex);
    return "error/sysError";
}   
/**
 * 处理 NoHandlerFoundException 类型的异常
 * @param ex
 * @param request
 * @return
 */
@ExceptionHandler(NoHandlerFoundException.class)
public String handlerNoFound(NoHandlerFoundException ex, HttpServletRequest request) {
    log.error(ex.getMessage(), ex);
    request.setAttribute("errorTips", ex.getMessage());
    return "error/404";
}   


}

可以根据异常类型通过@ExceptionHandler(XXX.class)声明不同的异常处理器.

但是要想处理ajax异步请求的404错误,还需要让DispatchServlet在遇到404时抛出异常,以便被handlerNoFound捕获。

application.properties中添加

spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false

第一行是找不到处理器时抛出异常。
第二行是解决静态文件404时抛nullpoint异常。

ErrorController

声明一个Controller并实现ErrorController。

@Controller
public class ExceptionHandlerController implements ErrorController{

        private static final String ERROR_PATH ="/error";

        @RequestMapping(value=ERROR_PATH)
        public String handlerException(HttpServletResponse res){
            System.out.println(res.getStatus());
            return "/error/404";    
        }

        @Override
        public String getErrorPath() {
            // TODO Auto-generated method stub
            return ERROR_PATH;
        }   

}

实现接口方法 getErrorPath(),返回异常时的重定向路径。
再声明一个@RequestMapping来处理这个重定向。传入参数为Response,以便获取status,再根据status返回不同的页面。

猜你喜欢

转载自blog.csdn.net/qq250782929/article/details/53511929