专栏首页知了一笑SpringBoot2.0 基础案例(03):配置系统全局异常映射处理

SpringBoot2.0 基础案例(03):配置系统全局异常映射处理

一、异常分类

这里的异常分类从系统处理异常的角度看,主要分类两类:业务异常和系统异常。

1、业务异常

业务异常主要是一些可预见性异常,处理业务异常,用来提示用户的操作,提高系统的可操作性。

常见的业务异常提示:
1)请输入xxx
2)xxx不能为空
3)xxx重复,请更换

2、系统异常

系统异常主要是一些不可预见性异常,处理系统异常,可以让展示出一个友好的用户界面,不易给用户造成反感。如果是一个金融类系统,在用户界面出现一个系统异常的崩溃界面,很有可能直接导致用户流失。

常见的系统异常提示:
1)页面丢失404
2)服务器异常500

二、解决应用启动后404界面

1、引入页面Jar包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2、自定义首页接口

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
    @RequestMapping("/")
    public String index(ModelMap modelMap) {
        modelMap.addAttribute("name","知了一笑") ;
        return "index";
    }
}

3、首页界面

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8" />
    <title></title>
</head>
<body>
<h1 th:text="${name}"></h1>
</body>
</html>

4、运行效果

三、SpringBoot2.0中异常处理

1、项目结构图

2、自定义业务异常类

public class ServiceException extends Exception {
    public ServiceException (String msg){
        super(msg);
    }
}

3、自定义异常描述对象

public class ReturnException {
    // 响应码
    private Integer code;
    // 异常描述
    private String msg;
    // 请求的Url
    private String url;
    // 省略 get set 方法
}

4、统一异常处理格式

1)两个基础注解 @ControllerAdvice 定义统一的异常处理类 @ExceptionHandler 定义异常类型对应的处理方式 2)代码实现

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice
// 异常以Json格式返回 等同 ExceptionHandler + ResponseBody 注解
// @RestControllerAdvice
public class HandlerException {
    /**
     * 自定义业务异常映射,返回JSON格式提示
     */
    @ExceptionHandler(value = ServiceException.class)
    @ResponseBody
    public ReturnException handler01 (HttpServletRequest request,ServiceException e){
        ReturnException returnException = new ReturnException() ;
        returnException.setCode(600);
        returnException.setMsg(e.getMessage());
        returnException.setUrl(String.valueOf(request.getRequestURL()));
        return returnException ;
    }
    /**
     * 服务异常
     */
    @ExceptionHandler(value = Exception.class)
    public ModelAndView handler02 (HttpServletRequest request,Exception e){
        ModelAndView modelAndView = new ModelAndView() ;
        modelAndView.addObject("ExeMsg", e.getMessage());
        modelAndView.addObject("ReqUrl", request.getRequestURL());
        modelAndView.setViewName("/exemsg");
        return modelAndView ;
    }
}

5、简单的测试接口

@Controller
public class ExeController {
    /**
     *  {
     *    "code": 600,
     *    "msg": "业务异常:ID 不能为空",
     *    "url": "http://localhost:8003/exception01"
     *  }
     */
    @RequestMapping("/exception01")
    public String exception01 () throws ServiceException {
        throw new ServiceException("业务异常:ID 不能为空");
    }

    @RequestMapping("/exception02")
    public String exception02 () throws Exception {
        throw new Exception("出现异常,全体卧倒");
    }
}

四、源代码地址

https://github.com/cicadasmile/spring-boot-base

本文分享自微信公众号 - 知了一笑(cicada_smile),作者:知了一笑

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot2.0 基础案例(05):多个拦截器配置和使用场景

    拦截器,请求的接口被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。 拦截器主要用来按照指定规则拒绝请求。

    知了一笑
  • 架构设计 | 异步处理流程,多种实现模式详解

    异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程。

    知了一笑
  • Java描述设计模式(10):组合模式

    知了一笑
  • ASP.NET Core路由中间件[3]: 终结点(Endpoint)

    到目前为止,ASP.NET Core提供了两种不同的路由解决方案。传统的路由系统以IRouter对象为核心,我们姑且将其称为IRouter路由。本章介绍的是最早...

    蒋金楠
  • 开源实体映射框架EmitMapper介绍

    EmitMapper是一个开源实体映射框架,地址:http://emitmapper.codeplex.com/。

    跟着阿笨一起玩NET
  • 固定QPS压测模式探索

    在早前跟测试同行在QQ群聊天的时候,聊过一个固定QPS压测的问题,最近突然有需求,想实现一下,丰富一下自己的性能测试框架,最新的代码请移步我的GitHub,地址...

    FunTester
  • Hadoop(十一)Hadoop IO之序列化与比较功能实现详解

    前言   上一篇给大家介绍了Hadoop是怎么样保证数据的完整性的,并且使用Java程序来验证了会产生.crc的校验文件。这一篇给大家分享的是Hadoop的序列...

    用户1195962
  • java 设计模式系列(12) —— 组合模式

    组合模式的定义: 将对象组合成树形结构以表示“部分-整体”的层次机构,使得用户对单个对象和组合对象的使用具有一致性。

    求和小熊猫
  • 详解Intellij IDEA搭建SpringBoot

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而...

    Java团长
  • 六、门面模式与装饰器模式详解

    门面模式(Facade Pattern)又叫外观模式,提供了一个统一的接口,用来访问子系统中的一群接 口。其主要特征是定义了一个高层接口,让子系统更容易使用,...

    编程之心

扫码关注云+社区

领取腾讯云代金券