iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Spring MVC异常统一处理的三种方式
  • 322
分享到

Spring MVC异常统一处理的三种方式

java教程SpringMVC 2014-07-04 00:07:01 322人浏览 才女
摘要

spring 统一异常处理有 3 种方式,分别为:使用@ ExceptionHandler注解、实现HandlerExceptionResolver接口、使用 @controlleradvice 注解使用 @ ExceptionHandle

spring 统一异常处理有 3 种方式,分别为:

使用@ ExceptionHandler注解、实现HandlerExceptionResolver接口、使用 @controlleradvice 注解

使用 @ ExceptionHandler 注解

使用该注解有一个不好的地方就是:进行异常处理的方法必须与出错的方法在同一个Controller里面。使用如下:

@Controller      
public class GlobalController {
      
@ExceptionHandler({MyException.class})
public String exception(MyException e) {
System.out.println(e.getMessage());
e.printStackTrace();
return "exception";
}
@RequestMapping("test")
public void test() {
throw new MyException("出错了!");
}
}

可以看到,这种方式最大的缺陷就是不能全局控制异常。每个类都要写一遍。

实现 HandlerExceptionResolver 接口

这种方式可以进行全局的异常控制。例如:

@Component  
public class ExceptionTest implements HandlerExceptionResolver{
  
public ModelAndView resolveException(httpservletRequest request, HttpServletResponse response, Object handler,  
            Exception ex) {
System.out.println("This is exception handler method!");
return null;
}
}

使用 @ControllerAdvice+ @ ExceptionHandler 注解

上文说到 @ ExceptionHandler 需要进行异常处理的方法必须与出错的方法在同一个Controller里面。那么当代码加入了 @ControllerAdvice,则不需要必须在同一个 controller 中了。这也是 Spring 3.2 带来的新特性。从名字上可以看出大体意思是控制器增强。 也就是说,@controlleradvice + @ ExceptionHandler 也可以实现全局的异常捕捉。

请确保此WEBExceptionHandle 类能被扫描到并装载进 Spring 容器中。

@ControllerAdvice
@ResponseBody
public class WebExceptionHandle {
private static Logger logger = LoggerFactory.getLogger(WebExceptionHandle.class);

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
public ServiceResponse handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
logger.error("参数解析失败", e);
return ServiceResponseHandle.failed("could_not_read_JSON");
}

@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public ServiceResponse handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
logger.error("不支持当前请求方法", e);
return ServiceResponseHandle.failed("request_method_not_supported");
}

@ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
@ExceptionHandler(HttpMediaTypeNotSupportedException.class)
public ServiceResponse handleHttpMediaTypeNotSupportedException(Exception e) {
logger.error("不支持当前媒体类型", e);
return ServiceResponseHandle.failed("content_type_not_supported");
}

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public ServiceResponse handleException(Exception e) {
if (e instanceof BusinessException){
return ServiceResponseHandle.failed("BUSINESS_ERROR", e.getMessage());
}
logger.error("服务运行异常", e);
e.printStackTrace();
return ServiceResponseHandle.failed("server_error");
}
}

如果 @ExceptionHandler 注解中未声明要处理的异常类型,则默认为参数列表中的异常类型。所以还可以写成这样:

@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler()
@ResponseBody
String handleException(Exception e){
return "Exception Deal! " + e.getMessage();
}
}

参数对象就是 Controller 层抛出的异常对象!

继承 ResponseEntityExceptionHandler 类来实现针对 Rest 接口 的全局异常捕获,并且可以返回自定义格式:

@Slf4j
@ControllerAdvice
public class ExceptionHandlerBean  extends ResponseEntityExceptionHandler {

@ExceptionHandler({DataNotFoundException.class})
public ResponseEntity handleDataNotFoundException(RuntimeException ex, WebRequest request) throws IOException {
return getResponseEntity(ex,request,ReturnStatusCode.DataNotFoundException);
}

private ResponseEntity getResponseEntity(RuntimeException ex, WebRequest request, ReturnStatusCode specificException) {
ReturnTemplate returnTemplate = new ReturnTemplate();
returnTemplate.setStatusCode(specificException);
returnTemplate.setErrORMsg(ex.getMessage());
return handleExceptionInternal(ex, returnTemplate,
new HttpHeaders(), HttpStatus.OK, request);
}
}

--结束END--

本文标题: Spring MVC异常统一处理的三种方式

本文链接: https://www.lsjlt.com/news/3930.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Spring全局异常处理的三种方式
    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。 那...
    99+
    2023-05-31
    spring 异常 异常处
  • 使用Spring MVC实现统一异常处理的方法
    这篇文章将为大家详细讲解有关使用Spring MVC实现统一异常处理的方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业...
    99+
    2023-05-31
    springmvc 异常处理
  • 【Spring AOP】统一异常处理
    统一异常处理 统⼀异常处理使⽤的是 @ControllerAdvice + @ExceptionHandler 来实现的, 类上面加上 @ControllerAdvice 注解表示控制器通知...
    99+
    2023-10-12
    spring java 后端
  • Spring异常实现统一处理的方法
    目录1.统一处理异常的机制2.关于统一处理异常的方法3.关于处理异常的方法的执行特点1.统一处理异常的机制 Spring MVC框架提供了统一处理异常的机制!表现为每种类型的异常只需...
    99+
    2022-12-08
    Spring异常统一处理 Spring异常处理
  • @Validated和@Valid三种异常捕获处理方式
    目录@Validated和@Valid异常捕获异常共三种@Valid和@Validated区别注解位置@Validated和@Valid异常捕获 异常共三种 BindExc...
    99+
    2024-04-02
  • 阿里nacos+springboot+dubbo2.7.3统一处理异常的两种方式
    目录1.为什么要抛异常?2.给出解决方案3.两种抛异常的实例解说总结在网上很多关于dubbo异常统一处理的博文,90%都是抄来抄去。大多都是先上一段dubbo中对于异常的统一处理的原...
    99+
    2024-04-02
  • springboot处理异常的5种方式
    目录1、自定义错误页面2、@ExceptionHandle 注解处理异常3、@ControllerAdvice+@ExceptionHandler 注解处理异常4、配置 Simple...
    99+
    2022-11-13
    springboot处理异常 springboot 异常
  • Spring MVC项目中的异常处理详解
    目录前言1. 基于配置的简单异常处理2. 基于注解的全局异常处理总结 前言 我们在项目的开发中,难免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统...
    99+
    2024-04-02
  • 使用spring aop统一处理异常和打印日志方式
    我们很容易写出的代码 我们很容易写出带有很多try catch 和 logger.warn(),logger.error()的代码,这样一个方法本来的业务逻辑只有5行,有了这些,代码...
    99+
    2024-04-02
  • Spring Boot全局统一异常处理器
    目录一、封装统一返回结果类二、自定义异常封装类三、错误枚举四、全局异常处理类五、测试一、封装统一返回结果类 import com.jiusen.exercise.enums.Er...
    99+
    2024-04-02
  • Spring中什么是统一异常处理
    这篇文章主要介绍“Spring中什么是统一异常处理”,在日常操作中,相信很多人在Spring中什么是统一异常处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring中什...
    99+
    2024-04-02
  • Spring MVC项目中的异常处理怎么配置
    这篇文章主要介绍“Spring MVC项目中的异常处理怎么配置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring MVC项目中的异常处理怎么配置”文章能帮助大家解决问题。...
    99+
    2023-06-30
  • C#各种异常处理方式总结
    .NET的异常处理机制用来发现、处理运行时错误。如果开发人员没有提供异常的处理机制,就默认采用.NET的机制。 通常使用try...catch...finally捕获异常。 try ...
    99+
    2024-04-02
  • 关于Spring统一异常处理及说明
    目录相关注解概述全局异常依赖包示例@ExceptionHandler注解使用方法基本使用方法注解的参数异常类型就近原则注解方法的返回值注解使用错误举例相关注解概述 通过使用@Rest...
    99+
    2024-04-02
  • Spring Boot如何统一处理全局异常
    这篇文章给大家分享的是有关Spring Boot如何统一处理全局异常的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。注解的介绍@ControllerAdvice@ControllerAdvice注解是Sp...
    99+
    2023-06-22
  • SpringBoot统一响应格式及统一异常处理
    目录一、统一响应基础类二、响应枚举类三、统一响应格式使用四、统一异常处理1. 自定义异常2.异常处理3.自定义异常使用在我们开发SpringBoot后端服务时,一般需要给前端统一响应...
    99+
    2023-05-19
    SpringBoot统一响应格式 SpringBoot统一异常处理
  • Java 超详细讲解Spring MVC异常处理机制
    目录异常处理机制流程图异常处理的两种方式简单异常处理器SimpleMappingExceptionResolver自定义异常处理步骤本章小结异常处理机制流程图 系统中异常包括两类: ...
    99+
    2024-04-02
  • springboot 全局异常处理和统一响应对象的处理方式
    目录springboot异常处理SpringBoot 默认的异常处理机制SpringBoot 全局异常处理1. 局部异常处理2. 全局异常处理自定义异常统一响应对象定义统一的响应对象...
    99+
    2024-04-02
  • spring boot全局统一返回RESTful风格数据、统一异常处理的方法
    本文小编为大家详细介绍“spring boot全局统一返回RESTful风格数据、统一异常处理的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“spring boot全局统一返回RESTful风格数据、...
    99+
    2024-04-02
  • nacos+springboot+dubbo2.7.3统一处理异常的方法
    这篇“nacos+springboot+dubbo2.7.3统一处理异常的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作