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全局异常处理的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringMVC统一异常处理实例代码

    一.需求 一般项目中都需要作异常处理,基于系统架构的设计考虑,使用统一的异常处理方法. 系统中异常类型有哪些? 包括预期可能发生的异常.运行时异常(RuntimeException),运行时异常不是预期会发生的. 针对预期可能发生的异常,在代码手动处理异常可以try/catch捕获,可以向上抛出. 针对运行时异常,只能通过规范代码质量.在系统测试时详细测试等排除运行时异常. 二.统一异常处理解决方案 2.1 定义异常 针对预期可能发生的异常,定义很多异常类型,这些异常类型通常继承于Excepti

  • 浅谈springmvc 通过异常增强返回给客户端统一格式

    在springmvc开发中,我们经常遇到这样的问题:逻辑正常执行时返回客户端指定格式的数据,比如json,但是遇NullPointerException空指针异常,NoSuchMethodException调用的方法不存在异常,返回给客户端的是服务端异常堆栈信息,导致客户端不能正常解析数据:这明显不是我们想要的. 幸好从spring3.2提供的新注解@ControllerAdvice,从名字上可以看出大体意思是控制器增强.原理是使用AOP对Controller控制器进行增强(前置增强.后置增强.

  • 基于SpringMVC的全局异常处理器介绍

    近几天又温习了一下SpringMVC的运行机制以及原理 我理解的springmvc,是设计模式MVC中C层,也就是Controller(控制)层,常用的注解有@Controller.@RequestMapping.@Autowared.@Component,今天呢,我所要写的是SpringMVC的全局异常处理器,关联的接口有HandlerExceptionResolver(Eclipse用户可以按Ctrl+Shift+T进行搜索该接口),什么是全局异常处理器?为什么要用它呢? 在企业开发中,各种

  • 简单了解SpringMVC全局异常处理常用方法

    项目中,可能会抛出多个异常,我们不可以直接将异常的堆栈信息展示给用户,有两个原因: 用户体验不好 非常不安全 所以,针对异常,我们可以自定义异常处理,SpringMVC 中,针对全局异常也提供了相应的解决方案,主要是通过 @ControllerAdvice 和@ExceptionHandler 两个注解来处理的. 以上传大小超出限制为例,自定义异常,只需要提供一个异常处理类即可: @ControllerAdvice//表示这是一个增强版的 Controller,主要用来做全局数据处理 publi

  • SpringMVC日期类型接收空值异常问题解决方法

    最近遇到SpringMVC写个controller类,传一个空串的字符类型过来,正常情况是会自动转成date类型的,因为数据表对应类类型就是date的 解决方法是在controller类的后面加个注解: @InitBinder protected void initDateFormatBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); binde

  • SpringMVC统一异常处理三种方法详解

    这篇文章主要介绍了SpringMVC-统一异常处理三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在 Spring MVC 应用的开发中,不管是对底层数据库操作,还是业务层或控制层操作,都会不可避免地遇到各种可预知的.不可预知的异常需要处理. 如果每个过程都单独处理异常,那么系统的代码耦合度高,工作量大且不好统一,以后维护的工作量也很大. 如果能将所有类型的异常处理从各层中解耦出来,这样既保证了相关处理过程的功能单一,又实现了异常信

  • Springmvc自定义异常处理器实现流程解析

    当dispatchServlet接收到controller抛出的异常时,会将异常交由 HandlerExceptionResolver 异常处理器处理!我们可以创建自定义异常处理器实现该接口来处理自定义异常 1) 自定义异常类 public class MyException extends Exception { // 异常信息 private String message; public MyException() { super(); } public MyException(String

  • springmvc如何进行异常处理

    异常处理 局部处理(直接写在处理器中) @ExceptionHandler public ModelAndView error(Exception exception) { ModelAndView mv = new ModelAndView(); mv.addObject("error", exception.getMessage()); mv.setViewName("forward:../error.jsp"); return mv; } 全局处理(新建一个类

  • Springmvc异常处理器及拦截器实现代码

    一.异常处理器 1.实现HandlerExceptionResolver接口 package com.wuxi.exceptions; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servl

  • springboot springmvc抛出全局异常的解决方法

    springboot中抛出异常,springboot自带的是springmvc框架,这个就不多说了. springmvc统一异常解决方法这里要说明的是.只是结合了springboot的使用而已.直接上代码,有效有用的才是ok. 1.定义异常捕获 package com.example.rest.error; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.Exce

  • SpringMvc @Valid如何抛出拦截异常

    SpringMvc中,校验参数可以使用 @Valid 注解,同时在相应的对象里使用 @NotBlank( message = "昵称不能为空") @NotNull( message = "ID不能为空") @Pattern( message = "不能包括空格" , regexp = "\\S+" ) 等等. 这个校验会把所有的参数都校验一遍,所以它的异常里会好些列表,直接使用e.getMessage(),会输出很多累赘的东西

随机推荐