`

Spring MVC 全局的异常处理

 
阅读更多
原文: http://my.oschina.net/u/1757031/blog/509272
Spring异常处理配置 http://panyongzheng.iteye.com/blog/2208146
spring基于注解的全局异常处理方式 http://panyongzheng.iteye.com/blog/2067110
使用Spring MVC统一异常处理实战 http://panyongzheng.iteye.com/blog/2213655
怎么在Spring Controller里面返回404  http://jaskey.github.io/blog/2014/09/27/how-to-return-404-in-spring-controller/
java的异常处理-注解方式 http://my.oschina.net/wnjustdoit/blog/603428



1、使用SimpleMappingExceptionResolver实现异常处理

  在Spring的配置文件applicationContext.xml中增加以下内容:
<!-- 系统错误转发配置[并记录错误日志]   -->  
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
<property name="defaultErrorView" value="error"></property>   <!-- 默认为500,系统错误(error.jsp)  -->  
<property name="defaultStatusCode" value="500"></property>  
<property name="statusCodes"><!-- 配置多个statusCode -->  
  <props>      
      <prop key="error">500</prop>  <!-- error.jsp -->  
      <prop key="error1">404</prop>    <!-- error1.jsp -->  
  </props>      
</property>      
<property name="exceptionMappings">  
    <props>  
        <!-- 这里你可以根据需要定义N多个错误异常转发 -->  
        <prop key="java.sql.SQLException">dbError</prop> <!-- 数据库错误(dbError.jsp) -->  
        <prop key="org.springframework.web.bind.ServletRequestBindingException">bizError</prop> <!-- 参数绑定错误(如:必须参数没传递)(bizError.jsp) -->  
        <prop key="java.lang.IllegalArgumentException">bizError</prop>  <!-- 参数错误(bizError.jsp) -->  
        <prop key="org.springframework.validation.BindException">bizError</prop>  <!-- 参数类型有误(bizError.jsp) -->  
        <prop key="java.lang.Exception">unknowError</prop>  <!-- 其他错误为'未定义错误'(unknowError.jsp)  -->  
    </props>  
</property>  
</bean> 

注:使用SimpleMappingExceptionResolver进行异常处理,具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点,但该方法仅能获取到异常信息,若在出现异常时,对需要获取除异常以外的数据的情况不适用。

2、 实现HandlerExceptionResolver 接口自定义异常处理器

  增加HandlerExceptionResolver 接口的实现类MyExceptionHandler,代码如下:
public class MyExceptionHandler implements HandlerExceptionResolver {  
   
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,  
            Exception ex) {  
        Map<String, Object> model = new HashMap<String, Object>();  
        model.put("ex", ex);  
           
        // 根据不同错误转向不同页面  
        if(ex instanceof BusinessException) {  
            return new ModelAndView("error-business", model);  
        }else if(ex instanceof ParameterException) {  
            return new ModelAndView("error-parameter", model);  
        } else {  
            return new ModelAndView("error", model);  
        }  
    }  
}

在Spring的配置文件applicationContext.xml中增加以下内容:
<bean id="exceptionHandler" class="cn.basttg.core.exception.MyExceptionHandler"/>

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

3 、使用@ExceptionHandler注解实现异常处理

  增加BaseController类,并在类中使用@ExceptionHandler注解声明异常处理,代码如下:
public class BaseController {  
    /** 基于@ExceptionHandler异常处理 */  
    @ExceptionHandler({ RuntimeException.class })
    public String exp(HttpServletRequest request, Exception ex) {  
           
        request.setAttribute("ex", ex);  
           
        // 根据不同错误转向不同页面  
        if(ex instanceof BusinessException) {  
            return "error-business";  
        }else if(ex instanceof ParameterException) {  
            return "error-parameter";  
        } else {  
            return "error";  
        }  
    }  
}

以下代码来判断是否是ajax方式, 一个权限的异常处理
@ExceptionHandler({UnauthorizedException.class})
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    public ModelAndView exception(final UnauthorizedException e, final HttpServletRequest request, Writer writer) {
        logger.error("全句异常 UnauthorizedException 处理......");
        String message = "你没有访问这个页面,表格或者接口等权限";
        e.printStackTrace();
        if (!"XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With"))) {
            ModelAndView view=new ModelAndView("/auth");
            view.addObject("message", message);
            return view;
        } else {
            try{
                ControllerContext context= ControllerContext.getNewControllerContext();
                context.addMessage(message);
                context.setError();
                writer.write(JSONUtil.toJSONString(context));
                writer.flush();
                writer.close();
            }catch (Exception e1){
                e1.printStackTrace();
            }finally {
                return null;
            }
        }
    }


修改代码,使所有需要异常处理的Controller都继承该类,

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

4、未捕获异常的处理

  修改web.xml文件,增加以下内容:
<!-- 出错页面定义 -->  
<error-page>  
    <exception-type>java.lang.Throwable</exception-type>  
    <location>/500.jsp</location>  
</error-page>  
<error-page>  
    <error-code>500</error-code>  
    <location>/500.jsp</location>  
</error-page>  
<error-page>  
    <error-code>404</error-code>  
    <location>/404.jsp</location>  
</error-page>  
   
<!-- 这里可继续增加服务器错误号的处理及对应显示的页面 -->
分享到:
评论

相关推荐

    Spring MVC全局异常处理和单元测试_动力节点Java学院整理

    `SimpleMappingExceptionResolver` 提供了一种方便的方式来集中处理异常,而单元测试则确保代码的各个组件独立且正确地运行。通过这些技术,开发者可以构建出更加稳定、易于维护的Spring MVC应用。

    spring mvc异常处理

    本文将深入探讨Spring MVC中的异常处理机制,帮助你更好地理解如何优雅地处理错误和异常。 1. **Spring MVC 异常处理概述** Spring MVC 提供了一种统一的方式来处理应用程序中抛出的异常。它通过`@...

    spring mvc

    为了统一处理异常,Spring MVC 提供了全局异常处理机制。可以通过定义 `ExceptionHandler` 方法或使用 `@ControllerAdvice` 注解的类来实现全局异常处理。 #### 十二、记录全局异常到日志 在 Spring MVC 中,可以...

    spring mvc异常简单处理

    确保正确配置这些依赖,是构建一个能够正常处理异常的Spring MVC项目的基础。 在`src`目录下,可能包含了Java源代码、配置文件等。通常,异常处理相关的类会放在`com.example.yourpackage.controller.advice`这样的...

    spring MVC快速入门-深入分析.pdf

    - **处理异常**:在异常处理类中使用 `@ExceptionHandler` 注解定义具体的异常处理方法。 - **日志记录**:可以在异常处理方法中记录异常信息到日志文件中。 #### 七、Spring MVC 单元测试 - **JUnit 测试**:使用...

    第19章spring-mvc之全局异常处理

    第19章spring-mvc之全局异常处理

    Spring MVC请求参数与响应结果全局加密和解密详解

    在本文中,我们将详细介绍Spring MVC请求参数与响应结果全局加密和解密的相关知识点,包括请求参数的加密和解密、响应结果的加密和解密、ContentType的处理等。 首先,让我们了解一下请求参数的加密和解密。为了...

    Spring MVC 教程快速入门 深入分析

    十一、Spring MVC如何实现全局的异常处理:提供了实现全局异常处理器的方式,让开发者能够捕获所有控制器抛出的异常,统一处理。 十二、Spring MVC如何把全局异常记录到日志中:讲述了如何将异常信息记录到日志文件...

    Spring MVC 4.2.3

    6. **异常处理**:通过定义全局异常处理器,可以统一处理应用程序中的异常,提高代码的整洁性和可维护性。 7. **多视图解析器**:Spring MVC支持多种视图解析器,如JSP、FreeMarker、Thymeleaf等,可以根据项目需求...

    最全最经典spring-mvc教程

    错误处理和异常处理也是Spring MVC中的重要部分,通过@ControllerAdvice和@ExceptionHandler可以全局处理异常,提供统一的错误页面。 最后,测试是任何应用程序开发的重要环节。Spring MVC提供了MockMVC,可以在不...

    spring mvc 4.0

    11. **错误处理**:通过@ControllerAdvice和@ExceptionHandler,可以全局处理异常,提供统一的错误页面或API响应。 12. **整合WebSocket**:Spring MVC 4.0开始支持WebSocket协议,允许实现实时通信,如聊天应用、...

    Spring MVC入门教程

    十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求 ...

    Spring MVC 教程 快速入门 深入分析

    十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求 ...

    Mastering Spring MVC 4(2015.09)源码

    首先,Spring MVC 4基于Servlet 3.0规范,这意味着它可以利用异步处理能力,提高了Web应用的性能。通过AsyncSupport和AsyncConfigurer接口,开发者可以轻松地创建异步控制器,处理高并发场景。 控制器(Controller...

    Spring MVC全局异常实例详解

    主要给大家介绍了关于Spring MVC全局异常的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

    Spring mvc5.0.3 所有jar包

    10. **异常处理**: 可以全局或局部地配置异常处理器,将异常转换为特定的视图或HTTP响应。`@ExceptionHandler`注解用于处理特定类型的异常。 11. **MVC配置**: 使用Java配置或XML配置来设置Spring MVC的行为。...

    精通Spring MVC4

    Spring MVC提供了一种优雅的异常处理机制,可以使用@ControllerAdvice和@ExceptionHandler注解定义全局异常处理器。此外,还可以自定义错误页面,提高用户体验。 8. **数据绑定和验证** Spring MVC支持自动的数据...

    spring mvc 整合包

    13. **异常处理**:通过@ControllerAdvice和@ExceptionHandler注解,可以全局处理异常,提供统一的错误页面。 14. **RESTful风格**:Spring MVC支持创建RESTful API,通过HTTP方法(GET、POST、PUT、DELETE等)和...

Global site tag (gtag.js) - Google Analytics