SpringMVC异常
时间:2019-11-11
本文章向大家介绍SpringMVC异常,主要包括SpringMVC异常使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用 @ ExceptionHandler 注解
使用该注解有一个不好的地方就是:进行异常处理的方法必须与出错的方法在同一个Controller里面。使用如下:
1 @Controller 2 public class GlobalController { 3 4 /** 5 * 用于处理异常的 6 * @return 7 */ 8 @ExceptionHandler({MyException.class}) 9 public String exception(MyException e) { 10 System.out.println(e.getMessage()); 11 e.printStackTrace(); 12 return "exception"; 13 } 14 15 @RequestMapping("test") 16 public void test() { 17 throw new MyException("出错了!"); 18 } 19 }
可以看到,这种方式最大的缺陷就是不能全局控制异常。每个类都要写一遍。
实现 HandlerExceptionResolver 接口
这种方式可以进行全局的异常控制。例如:
1 @Component 2 public class ExceptionTest implements HandlerExceptionResolver{ 3 4 /** 5 * TODO 简单描述该方法的实现功能(可选). 6 * @see org.springframework.web.servlet.HandlerExceptionResolver#resolveException(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception) 7 */ 8 public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, 9 Exception ex) { 10 System.out.println("This is exception handler method!"); 11 return null; 12 } 13 }
使用 @ControllerAdvice+ @ ExceptionHandler 注解
上文说到 @ ExceptionHandler 需要进行异常处理的方法必须与出错的方法在同一个Controller里面。那么当代码加入了 @ControllerAdvice,则不需要必须在同一个 controller 中了。这也是 Spring 3.2 带来的新特性。从名字上可以看出大体意思是控制器增强。 也就是说,@controlleradvice + @ ExceptionHandler 也可以实现全局的异常捕捉。
请确保此WebExceptionHandle 类能被扫描到并装载进 Spring 容器中。
1 @ControllerAdvice 2 @ResponseBody 3 public class WebExceptionHandle { 4 private static Logger logger = LoggerFactory.getLogger(WebExceptionHandle.class); 5 /** 6 * 400 - Bad Request 7 */ 8 @ResponseStatus(HttpStatus.BAD_REQUEST) 9 @ExceptionHandler(HttpMessageNotReadableException.class) 10 public ServiceResponse handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { 11 logger.error("参数解析失败", e); 12 return ServiceResponseHandle.failed("could_not_read_json"); 13 } 14 15 /** 16 * 405 - Method Not Allowed 17 */ 18 @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) 19 @ExceptionHandler(HttpRequestMethodNotSupportedException.class) 20 public ServiceResponse handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { 21 logger.error("不支持当前请求方法", e); 22 return ServiceResponseHandle.failed("request_method_not_supported"); 23 } 24 25 /** 26 * 415 - Unsupported Media Type 27 */ 28 @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) 29 @ExceptionHandler(HttpMediaTypeNotSupportedException.class) 30 public ServiceResponse handleHttpMediaTypeNotSupportedException(Exception e) { 31 logger.error("不支持当前媒体类型", e); 32 return ServiceResponseHandle.failed("content_type_not_supported"); 33 } 34 35 /** 36 * 500 - Internal Server Error 37 */ 38 @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 39 @ExceptionHandler(Exception.class) 40 public ServiceResponse handleException(Exception e) { 41 if (e instanceof BusinessException){ 42 return ServiceResponseHandle.failed("BUSINESS_ERROR", e.getMessage()); 43 } 44 45 logger.error("服务运行异常", e); 46 e.printStackTrace(); 47 return ServiceResponseHandle.failed("server_error"); 48 } 49 }
如果 @ExceptionHandler 注解中未声明要处理的异常类型,则默认为参数列表中的异常类型。所以还可以写成这样:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler() @ResponseBody String handleException(Exception e){ return "Exception Deal! " + e.getMessage(); } }
参数对象就是 Controller 层抛出的异常对象!
继承 ResponseEntityExceptionHandler 类来实现针对 Rest 接口 的全局异常捕获,并且可以返回自定义格式:
1 @Slf4j 2 @ControllerAdvice 3 public class ExceptionHandlerBean extends ResponseEntityExceptionHandler { 4 5 /** 6 * 数据找不到异常 7 * @param ex 8 * @param request 9 * @return 10 * @throws IOException 11 */ 12 @ExceptionHandler({DataNotFoundException.class}) 13 public ResponseEntity<Object> handleDataNotFoundException(RuntimeException ex, WebRequest request) throws IOException { 14 return getResponseEntity(ex,request,ReturnStatusCode.DataNotFoundException); 15 } 16 17 /** 18 * 根据各种异常构建 ResponseEntity 实体. 服务于以上各种异常 19 * @param ex 20 * @param request 21 * @param specificException 22 * @return 23 */ 24 private ResponseEntity<Object> getResponseEntity(RuntimeException ex, WebRequest request, ReturnStatusCode specificException) { 25 26 ReturnTemplate returnTemplate = new ReturnTemplate(); 27 returnTemplate.setStatusCode(specificException); 28 returnTemplate.setErrorMsg(ex.getMessage()); 29 30 return handleExceptionInternal(ex, returnTemplate, 31 new HttpHeaders(), HttpStatus.OK, request); 32 } 33 34 }
以上就是 Spring 处理程序统一异常的三种方式。
原文地址:https://www.cnblogs.com/ringqq/p/11837860.html
- 敲一天代码了,轻松下吧,精彩 !看人潮如海
- MongoDB副本集其他细节
- 数据库表设计对性能的影响
- V部落博客管理平台开源啦! Vue+SpringBoot强强联合!
- SpringBoot+SpringSecurity处理Ajax登录请求
- MongoDB副本集配置
- MongoDB副本集搭建
- vhr部门管理数据库设计与编程
- SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(六)
- 权限管理模块中动态加载Vue组件
- axios请求封装和异常统一处理
- SpringSecurity中密码加盐与SpringBoot中异常统一处理
- SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(二)
- SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(一)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android开发之拖动条和评分组件用法分析
- Android使用AsyncQueryHandler实现获取手机联系人功能
- Android用过TextView实现跑马灯效果的示例
- android如何设置Activity背景色为透明色
- Android 手机防止休眠的两种实现方法
- Android编程实现的首页左右滑动切换功能示例
- 零基础学小程序004----小程序post请求,提交数据到服务器,小程序下单,小程序用户注册功能
- HorizontalScrollView水平滚动控件使用方法详解
- Android Activity生命周期和堆栈管理的详解
- Android学习之SharedPerference存储详解
- Android编程实现对话框Dialog背景透明功能示例
- Android开发中DatePicker日期与时间控件实例代码
- Android Shader应用开发之霓虹闪烁文字效果
- Android中ToggleButton开关状态按钮控件使用方法详解
- 零基础学小程序005---小程序登陆注册功能实现