Spring Boot系列2-全局统一异常处理

猿份哥 1年前 ⋅ 792 阅读 ⋅ 0 个赞

原创: 天空和唯美 天空唯美 

点击查看原文

为什么要全局统一异常处理呢?
如果系统发生了异常,不做统一异常处理,前端会给用户展示一大片看不懂的文字。做统一异常处理后当异常发生后可以给用户一个温馨的提示,不至于使用户满头雾水,所以一方面是为了更好的用户体验 如果不统一全局异常,服务端和前端在遇到异常的时候处理起来杂乱无章非常费力。所以另一方面是为了制定规范提高工作效率

SpringBoot如何实现全局统一异常处理呢?
项目目录结构
 

 

自定义异常类
pom.xml加入lombok

<dependency>

       <groupId>org.projectlombok</groupId>

       <artifactId>lombok</artifactId>

</dependency>


MyException.java

@Getter

@Setter

public class MyException extends RuntimeException {

   private Integer code;

   public MyException(String msg){

       super(msg);

   }



   public MyException(Integer code,String msg){

       super(msg);

       this.code=code;

   }

}


自定义枚举类

public enum ResultEnum {

   SUCCESS(200,"成功"),

   FAIL(100,"失败"),

   EXCEPTION(300,"系统异常"),

   UNLOGIN(201,"未登录");



   private Integer code;

   private String msg;



   private ResultEnum(Integer code,String msg){

       this.code=code;

       this.msg=msg;

   }



   public Integer getCode() {

       return code;

   }



   public void setCode(Integer code) {

       this.code = code;

   }



   public String getMsg() {

       return msg;

   }


自定义全局异常捕获类
@ControllerAdvice

public class MyExceptionAdvice {



   @ExceptionHandler(value = Exception.class)

   @ResponseBody

   public Result defaultException(HttpServletRequest request,Exception e){

       e.printStackTrace();

       return Result.builder()

               .code(ResultEnum.EXCEPTION.getCode())

               .message(ResultEnum.EXCEPTION.getMsg())

               .build();

   }



   @ExceptionHandler(value = MyException.class)

   @ResponseBody

   public Result myException(HttpServletRequest request,MyException e){

       e.printStackTrace();

       Integer code=e.getCode();

       String message=e.getMessage();



       if (e.getCode()==null){

           code=ResultEnum.EXCEPTION.getCode();

       }

       if (e.getMessage()==null){

           message=ResultEnum.EXCEPTION.getMsg();

       }

       return Result.builder()

               .code(code)

               .message(message)

               .build();

   }

}


进行测试

@RestController

public class ExceptionController {

   @RequestMapping("/exception")

   public Result exception(String name,String pwd) throws Exception {

           String realname="tiankonglanlande";

           String realPwd="123";



           if(null!=name&&name.equals("xx")){

               throw new Exception("系统异常!");

           }

           if(StringUtils.isEmpty(name)||StringUtils.isEmpty(pwd)){

               throw new MyException("参数必须传!");

           }else if (!name.equals(realname)||!pwd.equals(realPwd)){

               throw new MyException("用户名或密码不正确!");

           }else if (name.equals("aa")){

               throw new MyException(200,"用户名存在!");

           }

           String info="你好["+name+"]!";

       return ResultUtils.success(info);

   }

   @RequestMapping("/unlogin")

   public Result unlogin() throws Exception {

       return ResultUtils.success(ResultEnum.UNLOGIN);

   }

   @RequestMapping("/success")

   public Result success() throws Exception {

       return ResultUtils.success(200,"自定义消息");

   }

}


运行测试在浏览器访问
可以看到浏览器返回对应的json字符

源码地址:https://github.com/tiankonglanlande/springboot


全部评论: 0

    我有话说:

    SpringBoot系列16-Spring boot2x快速整合swagger2(Open Api3注解版)

    前言:为什么要使用swagger 传统的web开发,前端和后端的HTTP接口文档交互都是使用word文档记录,存在不仅限于这些问题;不能时时更新,不易于传输etc. swagger2可以使用配置文件

    ...jar中没有主清单属性, spring boot或者spring cloud的maven项目 java -jar test.jar 方式启动报错:...jar中没有主清单属性

    1.spring boot或者spring cloud的maven项目老是遇到问题...jar中没有主清单属性 2.解决方法:在pom.xml中添加如下代码 <build> <

    spring boot面试题及答案持续更新中

    2019-07-28最新整理的spring boot面试题及答案 1.Spring Boot是什么 这是摘自官方的一段话 Spring Boot is designed to get you up

    Spring Boot系列1-helloword

      使用springboot简单轻松创建helloword SpringBoot系列1-helloword 关于springboot这是摘自官方的一段话 Spring Boot

    springboot1.5.9升级到springboot2.1.3遇到的问题

    1.问题描述: Failed to bind properties under 'spring.datasource.druid.driver' to java.sql.Driver:  

    我向20k+以上的java高级开发工程师提了那些面试问题

    暂无回答 2.spring Boot中如何自定义...

    SpringBoot系列14-加载yml,properties配置文件信息

    1.加载yml yml语法: 单个key value 写法 k:空格v eg: color: blue 对象写法 k: {k1: v1,k2: v2} k: k1: v1 k2: v2 list

    Spring Boot应用或SpringCloud程序设置端口号的几种方式

    前言:springboot项目的每个应用都需要设置端口号,如何设置端口号呢?主要有以下这几种方式 1.通过配置文件设置: (1)在/src/main/resources/路径下的application.properties添加 # 默认是8080...

    Spring Boot系列6-SpringBoot中使用servlet

    介绍在SpringBoot中如何使用servlet pom.xml <dependency> <groupId>org.springframework.boot<

    小程序spring boot发送订阅消息

    1.订阅消息实体类 @Data @AllArgsConstructor @NoArgsConstructor @Builder public class SingleSubscribeMessage implements Serializable...

    如果SpringBoot与SpringCloud老是出各种问题,别急!请看下面的SpringBoot与SpringCloud的版本对应详细版

    1.问题 当我们在开发微服务的时候因为SpringBoot和SpringCloud这两兄弟版本没有对应好老是出现各种各样的问题。特别苦逼!别急,往下看!遇到就是缘分,我叫猿份哥! 2.原因

    SpringBoot系列12-redis-pipeline keys模糊查询替代方案

    keys模糊查询遇到性能问题redis cup 99%以及解决方案 之前写过一篇文章 《java redis通过key模糊删除,批量删除,批量查询相关数据》,在项目中我也是这样使用的。刚开始还没有什么问题,后来数据多了,服务器redis cup ...

    Spring Boot系列8-使用jasypt加密配置文件内容简单版

    文章目录 1.为什么配置文件需要加密 2.首先引入pom依赖文件 3.在application.properties或者application.yml文件中配置加密密码 4.获取加密内容例如:我想

    加入公众号
    加入公众号