文档章节

spring boot的统一异常处理

阿信sxq
 阿信sxq
发布于 2017/05/09 20:53
字数 683
阅读 464
收藏 5

问题现象

在使用spring boot的时候,如果请求中产生了异常,又碰巧没有捕获的话,那么就会导致浏览器显示一个白板页,
这个白板页是spring boot自带的默认处理,提示你出错了,并且告知你这是默认的页面,推荐进行自定义处理

页面给出了错误的代码等信息

分析

仔细查看这个提示页面的话,会发现这个页面其实不是由异常直接产生的,而是由于产生异常之后需要重定向到"/error",
但是又没有对应的控制器,所以才会显示出这个页面的

而这个重定向的地址也是可以自定义的,在`application.properties`文件中使用`server.error.path=/error`进行配置

这里配置的实际是一个控制器,用于处理出现异常时的请求

spring boot默认又提供一个控制器来处理这个映射,就是“白板页”,http://docs.spring.io/spring-boot/docs/1.5.3.RELEASE/reference/htmlsingle/#howto-customize-the-whitelabel-error-page,控制器类`org.springframework.boot.autoconfigure.web.BasicErrorController`

当然也可以自定义处理,http://docs.spring.io/spring-boot/docs/1.5.3.RELEASE/reference/htmlsingle/#boot-features-error-handling

自定义处理

依据文档给出的自定义方法,参考之后,创建自定义的控制器

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.ErrorAttributes;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletRequestAttributes;

/**
 * 将错误信息处理请求重定向到首页
 *
 * @author 阿信sxq
 *
 */
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class MainsiteErrorController implements ErrorController {

    private ErrorAttributes errorAttributes;

    /**
     * 初始化
     * 
     * @param errorAttributes
     *            错误属性操作
     */
    @Autowired
    public MainsiteErrorController(ErrorAttributes errorAttributes) {
        Assert.notNull(errorAttributes, "ErrorAttributes must not be null");
        this.errorAttributes = errorAttributes;
    }

    /**
     * 处理普通的请求,重定向到首页
     *
     * @return 到首页的跳转
     */
    @RequestMapping(produces = "text/html")
    public String errorHTML() {
        return "redirect:/";
    }

    /**
     * 处理json(异步)请求,返回错误代码和json的错误信息描述
     *
     * @param request
     *            用户请求信息描述
     * @return 完整的http响应信息
     */
    @RequestMapping
    @ResponseBody
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        RequestAttributes requestAttributes = new ServletRequestAttributes(request);
        Map<String, Object> body = errorAttributes.getErrorAttributes(requestAttributes, false);
        HttpStatus status = getStatus(request);
        return new ResponseEntity<Map<String, Object>>(body, status);
    }

    /**
     * 获取错误编码
     * 
     * @param request
     *            用户请求信息描述
     * @return 状态信息
     */
    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == null) {
            return HttpStatus.INTERNAL_SERVER_ERROR;
        }
        try {
            return HttpStatus.valueOf(statusCode);
        } catch (Exception ex) {
            return HttpStatus.INTERNAL_SERVER_ERROR;
        }
    }

    /**
     * {@inheritDoc}<br>
     * 实现错误路径,暂时无用
     */
    @Override
    public String getErrorPath() {
        return "";
    }

}

抛出的异常使用运行时异常,这类异常不是强制要求检查的异常,并且需要在异常类上注解返回的http状态码

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

/**
 * 访问资源不允许访问的异常
 *
 * @author 阿信sxq
 *
 */
@ResponseStatus(HttpStatus.FORBIDDEN)
public class NotAllowedException extends RuntimeException {

    private static final long serialVersionUID = 4171363983670523285L;

    public NotAllowedException() {
        super("Not aloowed to access!");
    }

    public NotAllowedException(String message) {
        super(message);
    }

}

 

© 著作权归作者所有

共有 人打赏支持
阿信sxq

阿信sxq

粉丝 226
博文 82
码字总数 72407
作品 1
成都
后端工程师
私信 提问
springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解、请求乱码解决、统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制、登录...

wyait
06/06
0
0
SpringCloud SpringBoot mybatis分布式Web应用的统一异常处理

我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况。Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用...

itcloud
08/17
0
0
SpringCloud SpringBoot mybatis分布式微服务云架构返回JSON格式

在上述例子中,通过统一定义不同Exception映射到不同错误处理页面。而当我们要实现RESTful API时,返回的错误是JSON格式的数据,而不是HTML页面,这时候我们也能轻松支持。 本质上,只需在之...

itcloud
08/07
0
0
Spring Cloud Spring Boot mybatis分布式微服务云架构 返回JSON格式

在上述例子中,通过统一定义不同Exception映射到不同错误处理页面。而当我们要实现RESTful API时,返回的错误是JSON格式的数据,而不是HTML页面,这时候我们也能轻松支持。 本质上,只需在之...

itcloud
06/21
0
0
Spring Boot入门资料整理

Spring Boot 初识 SpringBoot前世今生 本文主要讲述spring boot的由来,即其它诞生的背景,初衷,现状,及对未来的展望。 Spring Boot参考指南中文版--Chapter1.Spring Boot中文文档 本节提供...

小致dad
2017/11/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊storm的ICommitterTridentSpout

序 本文主要研究一下storm的ICommitterTridentSpout ICommitterTridentSpout storm-core-1.2.2-sources.jar!/org/apache/storm/trident/spout/ICommitterTridentSpout.java public interface......

go4it
26分钟前
1
0
Ubuntu常用操作

查看端口号 netstat -anp |grep 端口号 查看已使用端口情况 netstat -nultp(此处不用加端口号) netstat -anp |grep 82查看82端口的使用情况 查找被占用的端口: netstat -tln netstat -tl...

hc321
昨天
1
0
网站cdn的静态资源突然访问变的缓慢,问题排查流程

1.首先我查看了一下是否自己的网络问题,通过对比其他资源的访问速度和下载速度,确认不是 2.通过ping 和 tracert 判断cdn域名能否正常访问,(最后回想感觉这一步可以省略,因为每次最终能访...

小海bug
昨天
3
0
Mybatis 学习笔记四 MyBatis-Plus插件

Mybatis 学习笔记四 MyBatis-Plus插件 maven依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <ve......

晨猫
昨天
5
0
小白带你认识netty(二)之netty服务端启动(下)

承接上一篇小白带你认识netty(二)之netty服务端启动(上),还剩下两步骤:3、注册Selector:将Channel注册到Selector上 和 4、端口的绑定:服务端端口的监听。 3、注册Selector:将Chann...

天空小小
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部