springMVC提供的异常处理主要有两种方式,一种是直接实现自己的 HandlerExceptionResolver,当然这也包括使用Spring已经为我们提供好的 SimpleMappingExceptionResolver和DefaultHandlerExceptionResolver,另一种是使用注解的 方式实现一个专门用于处理异常的Controller——ExceptionHandler.
1.spring mvc 自己实现了SimpleMappingExceptionResolver 和 DefaultHandlerExceptionResolver.
DefaultHandlerExceptionResolver,该解析器只是对其中的一些比较典型的异常进行了拦截,然后返回对应的错误码.
public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionResolver { //...... @Override protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { try { if (ex instanceof NoSuchRequestHandlingMethodException) { return handleNoSuchRequestHandlingMethod((NoSuchRequestHandlingMethodException) ex, request, response, handler); } else if (ex instanceof HttpRequestMethodNotSupportedException) { return handleHttpRequestMethodNotSupported((HttpRequestMethodNotSupportedException) ex, request, response, handler); } else if (ex instanceof HttpMediaTypeNotSupportedException) { return handleHttpMediaTypeNotSupported((HttpMediaTypeNotSupportedException) ex, request, response, handler); } //...... } catch (Exception handlerException) { logger.warn("Handling of [" + ex.getClass().getName() + "] resulted in Exception", handlerException); } return null; }
SimpleMappingExceptionResolver提供了通过异常类型 exceptionMappings来进行异常与视图之间的映射关系,提供了在发生异常时通过statusCodes来映射异常返回的视图名称和对应的 HttpServletResponse的返回码。而且可以通过defaultErrorView和defaultErrorCode来指定默认 值,defaultErrorView表示当没有在exceptionMappings里面找到对应的异常类型时就返回defaultErrorView 定义的视图,defaultErrorCode表示在发生异常时当没有在视图与返回码的映射关系statusCodes里面找到对应的映射时默认返回的返 回码。在使用SimpleMappingExceptionResolver时,当发生异常的时 候,SimpleMappingExceptionResolver将会把当前的异常对象放到自身属性exceptionAttribute中,当没有指 定exceptionAttribute时,exceptionAttribute就是用默认值exception。
public class SimpleMappingExceptionResolver extends AbstractHandlerExceptionResolver { /** The default name of the exception attribute: "exception". */ public static final String DEFAULT_EXCEPTION_ATTRIBUTE = "exception"; //当发生异常时,与视图的映射 private Properties exceptionMappings; private Class<?>[] excludedExceptions; //默认的视图,表示当抛出异常但没有在exceptionMappings里面找到对应的异常时 返回//名叫exception的视图 private String defaultErrorView; //定义在发生异常时视图跟返回码的对应关系 private Integer defaultStatusCode; private Map<String, Integer> statusCodes = new HashMap<String, Integer>(); private String exceptionAttribute = DEFAULT_EXCEPTION_ATTRIBUTE;
在需要使用到SimpleMappingExceptionResolver来处理异常时,一般需在xml配置bean.
如:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="NumberFormatException">number</prop><!-- 表示当抛出NumberFormatException的时候就返回名叫number的视图 --> <prop key="NullPointerException">null</prop> </props> </property> <property name="defaultErrorView" value="exception"/><!-- 表示当抛出异常但没有在exceptionMappings里面找到对应的异常时 返回名叫exception的视图--> <property name="statusCodes"><!-- 定义在发生异常时视图跟返回码的对应关系 --> <props> <prop key="number">500</prop><!-- 表示在发生NumberFormatException时返回视图number,然后这里定义发生异常时视图number对应的HttpServletResponse的返回码是500 --> <prop key="null">503</prop> </props> </property> <property name="defaultStatusCode" value="404"/><!-- 表示在发生异常时默认的HttpServletResponse的返回码是多少,默认是200 --> </bean>
2.使用@ExceptionHandler进行处理
使用@ExceptionHandler进行处理有一个不好的地方是在同一个Controller里面需要同时有进行异常处理的方法与出错的方法.
如:
@Controller public class GlobalController { /** * 用于处理异常的 * @return */ @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("出错了!"); } }
这里在页面上访问test方法的时候就会报错,而拥有该test方法的Controller又拥有一个处理该异常的方法,这个时候处理异常的方法就会被调用.
但是,一般在实际中,采用注解@ExceptionHandler来处理异常,都会建立一个父类BaseController.
public abstract class BaseController { @ExceptionHandler public String exception(HttpServletRequest request, Exception e) { //添加自己的异常处理逻辑,如日志记录 request.setAttribute("exceptionMessage", e.getMessage()); // 根据不同的异常类型进行不同处理 if(e instanceof SQLException) return "testerror"; else return "error"; } }
TestExceptionController:
@Controller @RequestMapping("/ex") public class TestExceptionController extends BaseController{ @RequestMapping("/index") public ModelAndView index() throws SQLException{ throw new SQLException("数据库异常"); } }
最后,添加testerror.jsp视图来显示错误信息:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page isELIgnored="false" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>error!</title> </head> <body> ${exceptionMessage} </body> </html>
最后,测试访问,捕捉到异常.
这样只要把我们的其它的Controller全部继承于BaseController就能实现异常的集中捕捉和处理了
相关推荐
本文将深入探讨Spring MVC中的异常处理机制,帮助你更好地理解如何优雅地处理错误和异常。 1. **Spring MVC 异常处理概述** Spring MVC 提供了一种统一的方式来处理应用程序中抛出的异常。它通过`@...
spring mvc统一处理异常,通过@ControllerAdvice+@ExceptionHandler
在Spring MVC框架中,异常处理是一项关键任务,它确保了应用程序在遇到错误或异常时能够优雅地响应。本文将深入探讨Spring MVC中的异常处理机制,包括如何配置、自定义异常处理器以及异常转换策略。 首先,Spring ...
错误处理和异常处理也是Spring MVC中的重要部分,通过@ControllerAdvice和@ExceptionHandler可以全局处理异常,提供统一的错误页面。 最后,测试是任何应用程序开发的重要环节。Spring MVC提供了MockMVC,可以在不...
这个jar文件包含Spring MVC框架相关的所有类。 包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、XSLT相关类。 当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的...
在Spring MVC框架中,异常处理是构建健壮应用不可或缺的一环。IDEA(IntelliJ IDEA)作为常用的集成开发环境,对Spring MVC的开发提供了全面的支持。本文将详细介绍如何在IDEA环境下进行Spring MVC的异常处理,并...
Spring框架是Java开发中最常用的开源框架之一,它极大地简化了企业级应用的开发工作。Spring Web模块和Spring Web MVC模块是Spring框架中的两个关键组成部分,它们在构建Web应用程序时起着至关重要的作用。 Spring ...
5. **异常处理**:Spring 2.0提供了@ControllerAdvice和@ExceptionHandler注解,使得全局异常处理更加简洁和高效。 接下来,Spring 2.5进一步扩展了这些特性,包括: 1. **@RequestMapping**:这是一个关键注解,...
Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用...
Spring Web MVC是Spring框架的核心模块之一,专为构建Web应用程序提供模型-视图-控制器(MVC)架构支持。在Spring 5.0.9这个版本中,它延续了Spring对开发者友好、灵活且高性能的设计原则,为开发人员提供了强大的...
赠送jar包:spring-webmvc-5.2.15.RELEASE.jar; 赠送原API文档:spring-webmvc-5.2.15.RELEASE-javadoc.jar; 赠送源代码:spring-webmvc-5.2.15.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-webmvc-...
Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...
在提供的"spring MVC.docx"文档中,可能详细介绍了如何配置Spring MVC环境,创建Controller,处理请求,以及如何配置视图解析器等内容。对于初学者来说,这是一份很好的实践指南,可以帮助理解Spring MVC的工作原理...
赠送jar包:springfox-spring-webmvc-3.0.0.jar; 赠送原API文档:springfox-spring-webmvc-3.0.0-javadoc.jar; 赠送源代码:springfox-spring-webmvc-3.0.0-sources.jar; 赠送Maven依赖信息文件:springfox-...
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用...Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
赠送jar包:spring-webmvc-5.0.8.RELEASE.jar; 赠送原API文档:spring-webmvc-5.0.8.RELEASE-javadoc.jar; 赠送源代码:spring-webmvc-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-webmvc-5.0.8....
赠送jar包:spring-webmvc-5.3.10.jar; 赠送原API文档:spring-webmvc-5.3.10-javadoc.jar; 赠送源代码:spring-webmvc-5.3.10-sources.jar; 赠送Maven依赖信息文件:spring-webmvc-5.3.10.pom; 包含翻译后的API...
这个资源可能包含了从基础到进阶的Spring MVC应用开发知识,以及朱冰(可能是作者或讲师)对Spring MVC的理解和实践经验。 描述中的"朱冰-springmvc"提示我们这个资料可能由一位名叫朱冰的专家或教师提供,专门讲解...
3. **Spring MVC**:学习Spring MVC的架构,包括DispatcherServlet、Controller、Model、View、ModelAndView等概念,以及请求处理流程。 4. **Struts集成**:如果使用了spring-webmvc-struts.jar,需要了解如何在...
9. **异步处理支持**:Spring MVC支持异步处理请求,允许在不阻塞线程的情况下执行耗时的操作,从而提高系统性能。 10. **国际化和本地化**:通过消息源和LocaleResolver,Spring MVC可以轻松实现应用的多语言支持...