springboot全局异常处理
2018-07-01 17:50
666 查看
项目中遇到运行时异常,总不能每个异常处理都去添加try catch逻辑,甚至有的时候一个偶然条件发生而导致异常,而我们没有进行对应的处理则会直接给请求者返回未知的错误,这在正式的上线的项目中是不允许,所以我们来配置全局异常处理。
1、使用到的注解:@ControllerAdvice注解是用来配置控制器通知的,我们可以配置过滤拦截具体一种或者多种类型的注解,添加annotations属性即可,在类的上方我们配置了@ControllerAdvice的annotations属性值为RestController.class,也就是只有添加了@RestController注解的控制器才会进入全局异常处理;因为我们全局返回的都是统一的Json格式的字符串,所以需要再类上配置@ResponseBody注解;@ExceptionHandler注解用来配置需要拦截的异常类型,默认是全局类型,可以通过value属性配置只对某个类型的异常起作用;@ResponseStatus注解用于配置遇到该异常后返回数据时的StatusCode的值,我们这里默认使用值500;
RestExceptionHandler配置代码如下
2、响应实体类
3、测试控制器类
4、pom文件引入web启动包即可,启动类SpringbootExceptionApplication默认即可。
启动项目,访问http://localhost:8080/index,得到正常的响应 {"status":true,"msg":"response success","data":"正常响应的数据"};访问http://localhost:8080/secend?number=1,得到异常处理的响应{"status":false,"msg":"数组下标越界","data":null};其它示例也都是预想中结果。
1、使用到的注解:@ControllerAdvice注解是用来配置控制器通知的,我们可以配置过滤拦截具体一种或者多种类型的注解,添加annotations属性即可,在类的上方我们配置了@ControllerAdvice的annotations属性值为RestController.class,也就是只有添加了@RestController注解的控制器才会进入全局异常处理;因为我们全局返回的都是统一的Json格式的字符串,所以需要再类上配置@ResponseBody注解;@ExceptionHandler注解用来配置需要拦截的异常类型,默认是全局类型,可以通过value属性配置只对某个类型的异常起作用;@ResponseStatus注解用于配置遇到该异常后返回数据时的StatusCode的值,我们这里默认使用值500;
RestExceptionHandler配置代码如下
package com.example.demo; 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.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; @ControllerAdvice(annotations=RestController.class) @ResponseBody public class RestExceptionHandler { @ExceptionHandler // @ExceptionHandler(value= {NumberFormatException.class}),只会在发生NumberFormatException时起作用 @ResponseStatus public ResponseBean exceptionHandler(Exception e) { ResponseBean rb = new ResponseBean(); rb.setStatus(false); rb.setMsg(e.getMessage()); return rb; } }
2、响应实体类
package com.example.demo; public class ResponseBean { private boolean status; private String msg; private Object data; public boolean getStatus() { return status; } public void setStatus(boolean status) { this.status = status; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
3、测试控制器类
package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class IndexController { @GetMapping("/index") public Object index() { ResponseBean rb = new ResponseBean(); rb.setStatus(true); rb.setMsg("response success"); //从service层获取到数据 rb.setData("正常响应的数据"); return rb; } @GetMapping("/secend") public Object secend(int number) { if(number ==1) { throw new ArrayIndexOutOfBoundsException("数组下标越界"); } ResponseBean rb = new ResponseBean(); rb.setStatus(true); rb.setMsg("response success"); //从service层获取到数据 rb.setData("正常响应的数据"); return rb; } @GetMapping("/third") public Object third(int number) { if(number ==1) { throw new NumberFormatException("转化异常"); } ResponseBean rb = new ResponseBean(); rb.setStatus(true); rb.setMsg("response success"); rb.setData("正常响应的数据"); //从service层获取到数据,抛出 return rb; } @GetMapping("/four") public Object four(int number) throws ClassNotFoundException { if(number ==1) { throw new ClassNotFoundException ("类找不到异常"); } ResponseBean rb = new ResponseBean(); rb.setStatus(true); rb.setMsg("response success"); rb.setData("正常响应的数据"); //从service层获取到数据,抛出 return rb; } }
4、pom文件引入web启动包即可,启动类SpringbootExceptionApplication默认即可。
启动项目,访问http://localhost:8080/index,得到正常的响应 {"status":true,"msg":"response success","data":"正常响应的数据"};访问http://localhost:8080/secend?number=1,得到异常处理的响应{"status":false,"msg":"数组下标越界","data":null};其它示例也都是预想中结果。
相关文章推荐
- springboot(4) 项目中全局异常的处理
- springboot学习-全局异常处理
- SpringBoot全局异常处理
- SpringBoot入门-7(全局异常处理)
- Springboot定义响应报文(自定义处理异常)
- Android应用捕获全局异常自定义处理
- Android全局异常处理(捕获异常,不弹出程序崩溃)
- asp.net捕获全局未处理异常的几种方法[转]
- springmvc全局异常处理
- 全局变量异常捕获处理
- spring boot 学习--03---web控制层全局异常处理
- .net winform全局异常处理
- 详解Android全局异常的捕获处理
- SpringMVC配置全局日期转换器,处理日期转换异常
- android 全局异常的处理 详解
- Android中处理崩溃异常 Android捕获全局异常信息并实现上传
- 利用Attribute和IErrorHandler处理WCF全局异常
- delphi中对数据库全局异常和局部异常的处理
- struts2异常处理,global-results定义全局结果处理
- 利用Attribute和IErrorHandler处理WCF全局异常