`
javaEEdevelop
  • 浏览: 862617 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

spring mvc Exception处理

 
阅读更多

 

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/>节点进行声明即可,示例如下:

Xml代码 
  1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
  2.     <!-- 定义默认的异常处理页面,当该异常类型的注册时使用 -->  
  3.     <property name="defaultErrorView" value="error"></property>  
  4.    <!--定义异常处理页面用来获取异常信息的变量名,默认名value为exception-->
  5.     <property name="exceptionAttribute" value="ex"></property>  
  6.     <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常也页名作为值 -->  
  7.     <property name="exceptionMappings">  
  8.         <props>  
  9.             <prop key="IOException">error</prop>  
  10.             <prop key="java.sql.SQLException">error</prop>  
  11.         </props>  
  12.     </property>  
  13. </bean>  

基于@ExceptionHandler的异常处理:

该方法需要定义在Controller内部,然后创建一个方法并用@ExceptionHandler注解来修饰用来处理异常,这个方法基本和@RequestMapping修饰的方法差不多,只是可以多一个类型为Exception的参数,@ExceptionHandler中可以添加一个或多个异常的类型,如果为空的话则认为可以触发所有的异常类型错误。

示例代码:

Java代码 
  1. /** 
  2.  * 基于@ExceptionHandler异常处理 
  3.  * @author ZYWANG 2011-4-2 
  4.  */  
  5. @Controller  
  6. public class ExceptionHandlerController {  
  7.       
  8.     @ExceptionHandler(value={IOException.class,SQLException.class})  
  9.     public String exp(Exception ex,HttpServletRequest request) {  
  10.         request.setAttribute("ex", ex);  
  11.         return "/error.jsp";  
  12.     }  
  13.   
  14. }  

页面使用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异常处理

    spring mvc异常处理,详细参考http://blog.csdn.net/xiejx618/article/details/41918611

    Spring MVC 入门实例

    首先, 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用程序接收到 http://localhost:8080/hello.do(事实上请求路径是 /hello.do) 的请求后, Spring 将这个请求交给一个名为 helloController ...

    spring mvc异常简单处理

    spring mvc让servlet容器直接处理异常.详细看:http://blog.csdn.net/xiejx618/article/details/41695255

    spring-mvc-error-handling-example:Spring MVC错误处理示例

    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 异常.zip

    spring-rest-exception-handler, 一个方便的RESTful api Spring MVC 异常 spring REST异常处理程序 这个项目的目的是为for提供一个方便的异常处理程序( 解析器),它满足了错误响应的最佳实践。 处理自定义异常。...

    spring-mvc-custom-exception:Spring MVC 中的异常处理

    spring-mvc-custom-exception 在 Spring MVC 中自定义现有的 ExceptionHandlerExceptionResolver 类以动态处理异常的示例如何运行示例 git clone ...mvc-custom-exceptionmvn spring-boot:run

    spring_MVC源码

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...

    problem-spring-web:用于处理Spring Web MVC中的问题的库

    Spring MVC和Spring WebFlux的问题 问题Spring Web是一组库,可轻松从Spring应用程序生成响应。 它填补了一个小众市场,它连接了和或从而使它们可以无缝地协同工作,而只需最少的开发人员工作。 在此过程中,它旨在...

    spring-jersey-jmh:Spring MVC吞吐量测试

    Spring MVC JMH吞吐量测试 ####跑步: mvn清洁包装 运行Jersey测试 java -jar target / benchmarks.jar JerseyHello 运行Spring测试 java -jar target / benchmarks.jar SpringHello 运行Spring,您应该看到...

    spring-boot mybaits spring security redis整合

    基于spring mvc注解。Exception统一管理。 spring security权限管理。 aop日志记录。 4、调度 ====== Spring task, 可以查询已经注册的任务。立即执行一次任务。 5、缓存和Session =========== 注解redis...

    spirng mvc 异常

    自己参考了网上的资源总结了一个spring mvc的异常处理,代码中有详细说明,默认运行异常按照注解方式,同时也提供了其他2种异常处理方式,希望对大家入门有帮助

    Manning.Spring.in.Action.4th.Edition.2014.11.epub

    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 Gossip

    第一个 Spring MVC 程式 WebApplicationContext Handler Mapping Handler Interceptor Controller 继承架构 ModelAndView View Resolver Exception Resolver 使用 Controller ...

    spring练习项目.7z

    资料包含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-boot mybaits shiro redis整合

    基于spring mvc注解。Exception统一管理。 shiro权限管理。 aop日志记录。 4、调度 ====== Spring task, 可以查询已经注册的任务。立即执行一次任务。 5、缓存和Session =========== 注解redis缓存数据,...

    org.springframework.web.servlet-3.0.1.RELEASE-A.jar

    nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userController' defined in ServletContext resource [/WEB-INF/springMVC-servlet.xml]: Error ...

    spring的jar包解决:DispatcherServlet

    dist下的modules下的jar包挨个试的,最后确定三个:(dist下)spring.jar,(dist/modules/)spring-webmvc.jar,及从另外找(下的)的 commons-logging.jar包;而且在Eclipse从build path------configure build path里面...

    Spring面试题

    1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 3....

    springmybatis

    mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in ...

    springboot+dubbo分布式架构,提供分布式缓存、分布式锁、分布式Session、读写分离

    MVC: 基于spring mvc注解,Rest风格Controller。Exception统一管理。 缓存和Session:注解redis缓存数据,Spring-session和redis实现分布式session同步,重启服务会话不丢失。 数据同步:基于redis的分布式锁。 Web...

Global site tag (gtag.js) - Google Analytics