Spring3.0中对异常的处理方法一共提供了两种:一种是使用HandlerExceptionResolver接口;一种是在Controller类内部使用@ExceptionHandler注解。使用第一种方式可以实现全局异常控制,并且Spring已经提供了一个默认的实现类SimpleMappingExceptionResolver;使用第二种方式可以在Controller内部实现更个性化点异常处理方式,灵活性更高。一般来说,项目中只需要采用第一种方式就可以了,每个人都自己定义异常的展现方式,太过个性了,不统一。
从目前的调查结果看,这两种方式不能共存,不知道未来的版本是否能将他们合二为一,这样才能灵活配置。
基于HandlerExceptionResolver接口的异常处理:
使用这种方式只需要实现resolveException方法,该方法返回一个ModelAndView对象,在方法内部对异常的类型进行判断,然后常见合适的ModelAndView对象,如果该方法返回了null,则Spring会继续寻找其他的实现了HandlerExceptionResolver接口的Bean。换句话说,Spring会搜索所有注册在其环境中的实现了HandlerExceptionResolver接口的Bean,逐个执行,直到返回了一个ModelAndView对象。
示例代码:
package cn.easier.exception;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import cn.easier.util.StringPrintWriter;
public class CustomExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception exception) {
System.out.println("CustomExceptionHandler..........................");
Map<String,Object> map = new HashMap<String,Object>();
//我们还需要一个辅助的类StringPrintWriter,因为ex.printStackTrace参数只有个PrintWriter类型的,java自带的StringWriter
//不可用,所以我们需要自己实现一个装饰器的StringPrintWriter。
StringPrintWriter strintPrintWriter = new StringPrintWriter();
exception.printStackTrace(strintPrintWriter);
map.put("ex", strintPrintWriter.toString());//将错误信息传递给view
if(exception instanceof IOException){
return new ModelAndView("IOError",map); //只能是地址,而且是跟spring-servlet配置中的prefix有关系
}else if(exception instanceof SQLException){
return new ModelAndView("SQLError",map);
}else if(exception instanceof RuntimeException){
return new ModelAndView("error",map); //只能在request作用域中
}
return null;
}
}
spring 声明:
<bean id="customExceptionHandler" class="cn.easier.exception.CustomExceptionHandler"/>
这个类必须声明到Spring中去,让Spring管理它,你可以使用@Component标签,也可以使用<bean/>节点。为了简单的进行异常处理,Spring提供了SimpleMappingExceptionResolver类,该类实现了HandlerExceptionResolver接口,需要使用时只需要使用<bean/>节点进行声明即可,示例如下:
- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
-
- <property name="defaultErrorView" value="error"></property>
-
<!--定义异常处理页面用来获取异常信息的变量名,默认名value为exception-->
- <property name="exceptionAttribute" value="ex"></property>
-
- <property name="exceptionMappings">
- <props>
- <prop key="IOException">error</prop>
- <prop key="java.sql.SQLException">error</prop>
- </props>
- </property>
- </bean>
基于@ExceptionHandler的异常处理:
该方法需要定义在Controller内部,然后创建一个方法并用@ExceptionHandler注解来修饰用来处理异常,这个方法基本和@RequestMapping修饰的方法差不多,只是可以多一个类型为Exception的参数,@ExceptionHandler中可以添加一个或多个异常的类型,如果为空的话则认为可以触发所有的异常类型错误。
示例代码:
-
-
-
-
- @Controller
- public class ExceptionHandlerController {
-
- @ExceptionHandler(value={IOException.class,SQLException.class})
- public String exp(Exception ex,HttpServletRequest request) {
- request.setAttribute("ex", ex);
- return "/error.jsp";
- }
-
- }
页面使用erro.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.lang.Exception" %>
<%@ page import="java.io.PrintWriter" %>
<!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>Insert title here</title>
</head>
<body>
<%--
//因为SimpleMappingExceptionResolver中的ex 是一个java.lang.Exception类型
<%Exception ex=(Exception)request.getAttribute("ex");%> --%>
<H2>Exception:</H2>
<%-- <%ex.printStackTrace(new PrintWriter(out));%> --%>
<!--<c:out value="${exception}"></c:out>-->
<!--map.put("ex", strintPrintWriter.toString());//将错误信息传递给view -->
<%=request.getAttribute("ex")%>
</body>
</html>
引用地址:http://zywang.iteye.com/blog/983801
分享到:
相关推荐
spring mvc异常处理,详细参考http://blog.csdn.net/xiejx618/article/details/41918611
首先, 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用程序接收到 http://localhost:8080/hello.do(事实上请求路径是 /hello.do) 的请求后, Spring 将这个请求交给一个名为 helloController ...
spring mvc让servlet容器直接处理异常.详细看:http://blog.csdn.net/xiejx618/article/details/41695255
Spring Boot & Spring MVC 异常处理的N种方法 参考文档: Spring Boot 1.5.4.RELEASE Spring framework 4.3.9.RELEASE 默认行为 根据Spring Boot官方文档的说法: For machine clients it will produce a JSON ...
spring-rest-exception-handler, 一个方便的RESTful api Spring MVC 异常 spring REST异常处理程序 这个项目的目的是为for提供一个方便的异常处理程序( 解析器),它满足了错误响应的最佳实践。 处理自定义异常。...
spring-mvc-custom-exception 在 Spring MVC 中自定义现有的 ExceptionHandlerExceptionResolver 类以动态处理异常的示例如何运行示例 git clone ...mvc-custom-exceptionmvn spring-boot:run
弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...
Spring MVC和Spring WebFlux的问题 问题Spring Web是一组库,可轻松从Spring应用程序生成响应。 它填补了一个小众市场,它连接了和或从而使它们可以无缝地协同工作,而只需最少的开发人员工作。 在此过程中,它旨在...
Spring MVC JMH吞吐量测试 ####跑步: mvn清洁包装 运行Jersey测试 java -jar target / benchmarks.jar JerseyHello 运行Spring测试 java -jar target / benchmarks.jar SpringHello 运行Spring,您应该看到...
基于spring mvc注解。Exception统一管理。 spring security权限管理。 aop日志记录。 4、调度 ====== Spring task, 可以查询已经注册的任务。立即执行一次任务。 5、缓存和Session =========== 注解redis...
自己参考了网上的资源总结了一个spring mvc的异常处理,代码中有详细说明,默认运行异常按照注解方式,同时也提供了其他2种异常处理方式,希望对大家入门有帮助
7.1. Alternate Spring MVC configuration 7.1.1. Customizing DispatcherServlet configuration 7.1.2. Adding additional servlets and filters 7.1.3. Declaring DispatcherServlet in web.xml 7.2. Processing ...
第一个 Spring MVC 程式 WebApplicationContext Handler Mapping Handler Interceptor Controller 继承架构 ModelAndView View Resolver Exception Resolver 使用 Controller ...
资料包含spring-iocdi-annotation-document,iocdi-annotation-mvc,iocdi-xml-extend,iocdi-annotation-extend proxy,jdkproxy-transaction,jdkproxy-salary,day02-itheima11-spring-08-cglibproxy,day02-itheima11-...
基于spring mvc注解。Exception统一管理。 shiro权限管理。 aop日志记录。 4、调度 ====== Spring task, 可以查询已经注册的任务。立即执行一次任务。 5、缓存和Session =========== 注解redis缓存数据,...
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userController' defined in ServletContext resource [/WEB-INF/springMVC-servlet.xml]: Error ...
dist下的modules下的jar包挨个试的,最后确定三个:(dist下)spring.jar,(dist/modules/)spring-webmvc.jar,及从另外找(下的)的 commons-logging.jar包;而且在Eclipse从build path------configure build path里面...
1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 3....
mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in ...
MVC: 基于spring mvc注解,Rest风格Controller。Exception统一管理。 缓存和Session:注解redis缓存数据,Spring-session和redis实现分布式session同步,重启服务会话不丢失。 数据同步:基于redis的分布式锁。 Web...