SpringMVC全局异常处理的三种方式

 更新时间:2021年01月13日 11:44:40   作者:用户1739750354287  
这篇文章主要介绍了SpringMVC全局异常处理的三种方式,帮助大家更好的理解和使用springmvc,感兴趣的朋友可以了解下

在 JavaEE 项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。

SpringMvc 对于异常处理这块提供了支持,通过 SpringMvc 提供的全局异常处理机制,能够将所有类型的异常处理从各个处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。

SpringMVC全局异常处理的三种方式

  • 使用 Spring MVC 提供的简单异常处理器 SimpleMappingExceptionResolver;
  • 实现 Spring 的异常处理接口 HandlerExceptionResolver 自定义自己的异常处理器;
  • 使用 @ExceptionHandler 注解实现异常处理;

案例实操

全局异常处理方式一

配置 SimpleMappingExceptionResolver 对象

<bean class="org.springframework.web.servlet.handler.SimpleMappingException Resolver">
  <property name="defaultErrorView" value="error"></property>
  <property name="exceptionAttribute" value="ex"></property>
  <property name="exceptionMappings">
    <props>
      <prop key="com.xxx.exception.BusinessException">error1</prop>
      <prop key="com.xxx.exception.ParamsException">error2</prop>
    </props>
  </property>
</bean>

全局异常处理方式二

实现 HandlerExceptionResolver 接口

@Component
public class GlobalException implements HandlerExceptionResolver {
  @Override
  public ModelAndView resolveException(HttpServletRequest request,
    HttpServletResponse response, Object handler, Exception ex) {
      Map<String,Object> map=new HashMap<String, Object>();
      map.put("ex", ex);
      ModelAndView mv=null;
      if(ex instanceof ParamsException){
      	return new ModelAndView("error_param", map);
      }
      if(ex instanceof BusinessException){
      	return new ModelAndView("error_business", map);
      }
    return new ModelAndView("error", map);
  } 
}

使用实现 HandlerExceptionResolver 接口的异常处理器进行异常处理,具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提供更详细的异常处理信息。

全局异常处理方式三

页面处理器继承 BaseController

public class BaseController {
  @ExceptionHandler
  public String exc(HttpServletRequest request,HttpServletResponse
  response,Exception ex){
    request.setAttribute("ex", ex);
    if(ex instanceof ParamsException){
      return "error_param"; 
    }
    if(ex instanceof BusinessException){
      return "error_business"; 
    }
    return "error";
  } 
}

使用 @ExceptionHandler 注解实现异常处理,具有集成简单、有扩展性好(只需要将要异常处理的 Controller 类继承于 BaseController 即可)、不需要附加 Spring 配置等优点,但该方法对已有代码存在入侵性(需要修改已有代码,使相关类继承于 BaseController),在异常处理时不能获取除异常以外的数据。

扩展~未捕获异常的处理

对于 Unchecked Exception 而言,由于代码不强制捕获,往往被忽略,如果运行期产生了 Unchecked Exception,而代码中又没有进行相应的捕获和处理,则我们可能不得不面对尴尬的 404、500……等服务器内部错误提示页面。我们需要一个全面而有效的异常处理机制。目前大多数服务器也都支持在 Web.xml 中通过 (Websphere/Weblogic) 或者 (Tomcat) 节点配置特定异常情况的显示页面。修改 web.xml 文件,增加以下内容: java.lang.Throwable /500.jsp 500 /500.jsp 404 /404.jsp

以上就是SpringMVC全局异常处理的三种方式的详细内容,更多关于SpringMVC全局异常处理的资料请关注脚本之家其它相关文章!

相关文章

  • Java编程BigDecimal用法实例分享

    Java编程BigDecimal用法实例分享

    这篇文章主要介绍了Java编程BigDecimal用法实例分享,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 关于dubbo的RPC和RESTful性能及对比

    关于dubbo的RPC和RESTful性能及对比

    这篇文章主要介绍了关于dubbo的RPC和RESTful性能及对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java Session验证码案例代码实例解析

    Java Session验证码案例代码实例解析

    这篇文章主要介绍了Java Session验证码案例代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • SpringCloud Gateway的路由,过滤器和限流解读

    SpringCloud Gateway的路由,过滤器和限流解读

    这篇文章主要介绍了SpringCloud Gateway的路由,过滤器和限流解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 2024版本IDEA创建Servlet模板的图文教程

    2024版本IDEA创建Servlet模板的图文教程

    新版IDEA 2024.1.4中,用户需要自行创建Servlet模板以解决Web项目无法通过右键创建Servlet的问题,本文详细介绍了添加ServletAnnotatedClass.java模板的步骤,帮助用户快速配置并使用新的Servlet模板,需要的朋友可以参考下
    2024-10-10
  • 详解SpringBoot构建的Web项目如何在服务端校验表单输入

    详解SpringBoot构建的Web项目如何在服务端校验表单输入

    这篇文章主要介绍了详解SpringBoot构建的Web项目如何在服务端校验表单输入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • JVM中的程序计数寄存器PC是什么详解

    JVM中的程序计数寄存器PC是什么详解

    这篇文章主要介绍了JVM中的程序计数寄存器PC原理分析,JVM中的程序计数寄存器(Program Counter Register),Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息
    2021-09-09
  • Java 设计模式之适配器模式详解

    Java 设计模式之适配器模式详解

    设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性
    2021-11-11
  • Java字节流与基本数据类型的转换实例

    Java字节流与基本数据类型的转换实例

    本篇文章主要介绍了Java字节流与基本数据类型的转换实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java lambda list转换map时,把多个参数拼接作为key操作

    Java lambda list转换map时,把多个参数拼接作为key操作

    这篇文章主要介绍了Java lambda list转换map时,把多个参数拼接作为key操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论