使用Spring MVC统一异常处理实战

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Spring MVC统一异常处理实战相关的知识,希望对你有一定的参考价值。

1 描写叙述 
在J2EE项目的开发中。无论是对底层的数据库操作过程。还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常须要处理。每一个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一。维护的工作量也非常大。

 
那么,能不能将全部类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的。

以下将介绍使用Spring MVC统一处理异常的解决和实现过程。 

2 分析 
Spring MVC处理异常有3种方式: 
(1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver。 
(2)实现Spring的异常处理接口HandlerExceptionResolver 自己定义自己的异常处理器; 
(3)使用@ExceptionHandler注解实现异常处理; 

3 实战 
3.1 引言 
为了验证Spring MVC的3种异常处理方式的实际效果。我们须要开发一个測试项目,从Dao层、Service层、Controller层分别抛出不同的异常。然后分别集成3种方式进行异常处理,从而比較3种方式的优缺点。

 

3.2 实战项目 
3.2.1 项目结构 
技术分享技术分享 

3.2.2 Dao层代码 

Java代码  技术分享
  1. @Repository("testDao")  
  2. public class TestDao {  
  3.     public void exception(Integer id) throws Exception {  
  4.         switch(id) {  
  5.         case 1:  
  6.             throw new BusinessException("12""dao12");  
  7.         case 2:  
  8.             throw new BusinessException("22""dao22");  
  9.         case 3:  
  10.             throw new BusinessException("32""dao32");  
  11.         case 4:  
  12.             throw new BusinessException("42""dao42");  
  13.         case 5:  
  14.             throw new BusinessException("52""dao52");  
  15.         default:  
  16.             throw new ParameterException("Dao Parameter Error");  
  17.         }  
  18.     }  
  19. }  

3.2.3 Service层代码 
Java代码  技术分享
  1. public interface TestService {  
  2.     public void exception(Integer id) throws Exception;  
  3.       
  4.     public void dao(Integer id) throws Exception;  
  5. }  
  6.   
  7. @Service("testService")  
  8. public class TestServiceImpl implements TestService {  
  9.     @Resource  
  10.     private TestDao testDao;  
  11.       
  12.     public void exception(Integer id) throws Exception {  
  13.         switch(id) {  
  14.         case 1:  
  15.             throw new BusinessException("11""service11");  
  16.         case 2:  
  17.             throw new BusinessException("21""service21");  
  18.         case 3:  
  19.             throw new BusinessException("31""service31");  
  20.         case 4:  
  21.             throw new BusinessException("41""service41");  
  22.         case 5:  
  23.             throw new BusinessException("51""service51");  
  24.         default:  
  25.             throw new ParameterException("Service Parameter Error");  
  26.         }  
  27.     }  
  28.   
  29.     @Override  
  30.     public void dao(Integer id) throws Exception {  
  31.         testDao.exception(id);  
  32.     }  
  33. }  

3.2.4 Controller层代码 
Java代码  技术分享
  1. @Controller  
  2. public class TestController {  
  3.     @Resource  
  4.     private TestService testService;  
  5.       
  6.     @RequestMapping(value = "/controller.do", method = RequestMethod.GET)  
  7.     public void controller(HttpServletResponse response, Integer id) throws Exception {  
  8.         switch(id) {  
  9.         case 1:  
  10.             throw new BusinessException("10""controller10");  
  11.         case 2:  
  12.             throw new BusinessException("20""controller20");  
  13.         case 3:  
  14.             throw new BusinessException("30""controller30");  
  15.         case 4:  
  16.             throw new BusinessException("40""controller40");  
  17.         case 5:  
  18.             throw new BusinessException("50""controller50");  
  19.         default:  
  20.             throw new ParameterException("Controller Parameter Error");  
  21.         }  
  22.     }  
  23.       
  24.     @RequestMapping(value = "/service.do", method = RequestMethod.GET)  
  25.     public void service(HttpServletResponse response, Integer id) throws Exception {  
  26.         testService.exception(id);  
  27.     }  
  28.       
  29.     @RequestMapping(value = "/dao.do", method = RequestMethod.GET)  
  30.     public void dao(HttpServletResponse response, Integer id) throws Exception {  
  31.         testService.dao(id);  
  32.     }  
  33. }  

3.2.5 JSP页面代码 
Java代码  技术分享
  1. <%@ page contentType="text/html; charset=UTF-8"%>  
  2. <html>  
  3. <head>  
  4. <title>Maven Demo</title>  
  5. </head>  
  6. <body>  
  7. <h1>全部的示例</h1>  
  8. <h3>[url=./dao.do?

    id=1]Dao正常错误[/url]</h3>  

  9. <h3>[url=./dao.do?id=10]Dao參数错误[/url]</h3>  
  10. <h3>[url=./dao.do?id=]Dao未知错误[/url]</h3>  
  11.   
  12.   
  13. <h3>[url=./service.do?id=1]Service正常错误[/url]</h3>  
  14. <h3>[url=./service.do?id=10]Service參数错误[/url]</h3>  
  15. <h3>[url=./service.do?id=]Service未知错误[/url]</h3>  
  16.   
  17.   
  18. <h3>[url=./controller.do?id=1]Controller正常错误[/url]</h3>  
  19. <h3>[url=./controller.do?id=10]Controller參数错误[/url]</h3>  
  20. <h3>[url=./controller.do?id=]Controller未知错误[/url]</h3>  
  21.   
  22.   
  23. <h3>[url=./404.do?id=1]404错误[/url]</h3>  
  24. </body>  
  25. </html>  

3.3 集成异常处理 
3.3.1 使用SimpleMappingExceptionResolver实现异常处理 
1、在Spring的配置文件applicationContext.xml中添加下面内容: 
Xml代码  技术分享
  1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
  2.     <!-- 定义默认的异常处理页面,当该异常类型的注冊时使用 -->  
  3.     <property name="defaultErrorView" value="error"></property>  
  4.     <!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->  
  5.     <property name="exceptionAttribute" value="ex"></property>  
  6.     <!-- 定义须要特殊处理的异常,用类名或全然路径名作为key,异常也页名作为值 -->  
  7.     <property 





























以上是关于使用Spring MVC统一异常处理实战的主要内容,如果未能解决你的问题,请参考以下文章

spring mvc 异常统一处理方式

Spring MVC学习—项目统一异常处理机制详解与使用案例

Spring Boot2从入门到实战:统一异常处理

spring-boot实战07:Spring Boot中Web应用的统一异常处理

spring MVC实践

spring 或 springboot统一异常处理