`

二 基于Spring的异常体系处理

 
阅读更多

1.Spring的DAO异常体系

Spring在DAO层建立了一套面向DAO层统一的异常体系,同时将各种访问数据的检查型异常转换为非检查型异常,为整合各种持久层框架(spring JDBC,Hibernate,ibatis)提供基础。



 Spring将DAO层进行了封装,形成统一的异常体系架构,其基类为DataAccessException。

2、基于spring的JEE体系架构异常处理方案

      程序中对于异常的处理,应遵循一个原则,那就是能处理的异常要处理,不能处理的异常要抛出去,二不能隐藏或遗漏异常的处理。同时,针对抛出的异常,我们应根据类型分为应用异常和系统异常。

      应用异常是由于违反相关的业务逻辑而导致的错误。该错误不是致命的错误,可把错误信息报告给用户,来提醒用户,用户可通过重新操作来完成预期的业务。针对应用系统异常,应划分更详细的子异常,以满足业务的需要才是有意义的。

      系统异常是程序系统发生的bug错误或出现的致命错误,此时必须终止服务,抛出错误。即使用户再重复操作,也不能完成业务将受限,是后台管理员关注的。

      针对这种情况,我们可以定义如下的异常:

 (1)数据层异常

     spring框架提供了统一的DAO异常处理架构,其基类为DataAccessException。分析下数据库的操作和抛出的DataAccessException子类,以区分哪些是应用异常,哪些是系统异常。

      插入操作:应抛出DuplicateKeyException(应用异常)和DataAccessException(系统异常)。

      查询操作:findbyPrimarykey 应抛出ObjectNotFoundException(应用异常)和DataAccessException(系统异常)。count应抛出DataAccessException(系统异常)。

      更新操作:应抛出ObjectNotFoundException(应用异常)DuplicateKeyException(应用异常)和DataAccessException(系统异常)。

      删除操作:应抛出ObjectNotFoundException(应用异常)和DataAccessException(系统异常)。

spring的DAO层异常架构将异常统一为非检查异常。我们在DAO层的代码中可以将上述的异常抛出,也可以不做异常处理,但在业务层的处理中必须将这些异常捕获出来转换为我们定义的应用异常和系统异常。

      下面的代码都可以接受:

public addUser(User){

框架集成接口

}

 

public addUser(user)throws DuplicateKeyException,DataAccessExceptiom{

//orm框架接口操作

}

 (2)业务层异常处理

       业务层中,通过异常链保存原始异常信息。程序员必须自己编码来保存原始异常的信息。在业务逻辑中,捕获DataAccessException异常,处理包装成SystemException异常抛出。捕获ObjectNotFoundException,DuplicateKeyException异常,处理包装成BusinessException异常抛出。业务层中应根据业务的不同,将异常尽量分得细一点,否则,自定义的异常没有太多的意义。

      业务层异常处理代码如下:

public addUser(User user) throws BusinessException,SystemException{
        try{
              userDao.addUser(user);
        }catch(DuplicatekeyException ex){
             log.infor("......................");
             throw new BusinessException(ex.getCause(),"国际化信息");
        }catch(DataAccessException ex){
             log.error("......................");
             throw new SystemException(ex.getCause(),"国际化信息");
        }
}

 (3) 表现层异常处理

      在控制层,我们需要将通过try..catch方法进行捕获异常,经行包装处理,保存异常信息,将错误信息同时转到error页面。下面以spring MVC方式举例说明异常页面的处理。

      I. 公共页面403,404. 405,500错误需要配置在web.xml中

web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SpringExceptionResearch</display-name>
	<!--******************************** -->
	<!--*******log4j日志信息的配置,设置在classpath根目录下 ,spring中很多代码使用了不同的日志接口,
	既有log4j也有commons-logging,这里只是强制转换为log4j!并且,log4j的配置文件只能放在classpath根路径。
	同时,需要通过commons-logging配置将日志控制权转交给log4j。同时commons-logging.properties必须放置
	在classpath根路径****** -->
	<!--******************************* -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:log4j.xml</param-value>
	</context-param>
	
	<!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond,可以不设置 -->
	<context-param>
		<param-name>log4jRefreshInterval</param-name>
		<param-value>60000</param-value>
	</context-param>

	<!--******************************** -->
	<!--*******spring bean的配置******** -->
	<!--applicationContext.xml用于对应用层面做整体控制。按照分层思想,
	统领service层,dao层,datasource层,及国际化层-->
	<!--******************************* -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<listener>
		<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
	</listener>
	<!--******************************** -->
	<!--*******字符集 过滤器************ -->
	<!--******************************* -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!-- Spring 分发器,设置MVC配置信息 -->
	<servlet>
		<servlet-name>SpringExceptionResearch</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/applicationContext-servlet.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<!--******************************** -->
	<!--***使用.html后缀,一方面用户不能通过URL知道我们采用何种服务端技术,
	同时,可骗过搜索引擎,增加被收录的概率 。真正的静态网页可以用.htm,以避免被框架拦截-->
	<!--******************************* -->
	<servlet-mapping>
		<servlet-name>SpringExceptionResearch</servlet-name>
		<url-pattern>*.html</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
 	</welcome-file-list>
	<error-page>
		<error-code>403</error-code>
		<location>/WEB-INF/pages/error/403.jsp</location>
	</error-page>
	<error-page>
		<error-code>404</error-code>
		<location>/WEB-INF/pages/error/404.jsp</location>
	</error-page>
	<error-page>
		<error-code>405</error-code>
		<location>/WEB-INF/pages/error/405.jsp</location>
	</error-page>
	<error-page>
		<error-code>500</error-code>
		<location>/WEB-INF/pages/error/500.jsp</location>
	</error-page>

</web-app>

 2、在dispatch对应的MVC xml配置如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
			http://www.springframework.org/schema/beans/spring-beans.xsd
			http://www.springframework.org/schema/context 
			http://www.springframework.org/schema/context/spring-context.xsd
			http://www.springframework.org/schema/aop 
			http://www.springframework.org/schema/aop/spring-aop.xsd
			http://www.springframework.org/schema/tx 
			http://www.springframework.org/schema/tx/spring-tx.xsd
			http://www.springframework.org/schema/mvc 
			http://www.springframework.org/schema/mvc/spring-mvc.xsd
			http://www.springframework.org/schema/context 
			http://www.springframework.org/schema/context/spring-context.xsd">
			
	<!-- 配置静态资源,直接映射到对应的文件夹,不被DispatcherServlet处理 -->
	<mvc:resources mapping="/images/**" location="/images/"/>
	<mvc:resources mapping="/css/**" location="/css/"/>
	<mvc:resources mapping="/js/**" location="/js/"/>
	<mvc:resources mapping="/html/**" location="/html/"/>
	<mvc:resources mapping="/common/**" location="/common/"/>
	
	<!-- Configures the @Controller programming model -->
	<mvc:annotation-driven />
	
    <!--扫描web包,应用Spring的注解-->
    <context:component-scan base-package="com.jason.web"/>
	
	<bean id="captchaProducer" name= "captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">  
	    <property name="config">  
	        <bean class="com.google.code.kaptcha.util.Config">  
	            <constructor-arg>  
	                <props>  
						<prop key="kaptcha.image.width">300</prop>
						<prop key="kaptcha.image.height">60</prop>
						<prop key="kaptcha.textproducer.char.string">0123456789</prop>
						<prop key="kaptcha.textproducer.char.length">4</prop> 
	                </props>  
	            </constructor-arg>  
	        </bean>  
	    </property>  
	</bean>
	
	<!-- 全局异常配置 start -->
	<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<!-- 系统常见设置statusCodes -->
		<property name="exceptionMappings"> 
	     	<props> 
			  <prop key="com.jason.exception.SystemException">error/500</prop> 
	          <prop key="com.jason.exception.BusinessException">error/errorpage</prop> 
	       </props> 
	   	</property>
		<!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 -->
		<property name="warnLogCategory" value="WARN"></property>
		<!-- 默认错误页面,当找不到上面mappings中指定的异常对应视图时,使用本默认配置 -->
		<property name="defaultErrorView" value="error/500"></property>
		<!-- 默认HTTP状态码 -->
		<property name="defaultStatusCode" value="500"></property> 
	</bean>
	<!-- 全局异常配置 end -->

	
	<!--启动Spring MVC的注解功能,设置编码方式,防止乱码-->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
      <property name="messageConverters">   
         <list>   
             <bean class = "org.springframework.http.converter.StringHttpMessageConverter">   
                <property name = "supportedMediaTypes">
                      <list>
                          <value>text/html;charset=UTF-8</value>   
                     </list>   
                </property>   
             </bean>   
         </list>   
   	  </property> 
    </bean>
	<!--对模型视图名称的解析,即在模型视图名称添加前后缀InternalResourceViewResolver-->
	<!--默认的就是JstlView所以这里就不用配置viewClass -->
    <bean id="viewResolver"  class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
	 	p:prefix="/WEB-INF/pages/" 
	 	p:suffix=".jsp" />
</beans>

 

 

 

  • 大小: 15.7 KB
  • 大小: 9.6 KB
分享到:
评论
1 楼 chengwu1201 2015-06-19  
         

相关推荐

    基于SpringCloud的微服务治理架构方案.docx

    SpringBootAdmin提供了对SpringBoot应用的可视化监控,包括健康检查、日志查看、环境信息展示等功能,有助于及时发现和处理系统异常。 四、敏捷开发运维保障 1. 运维保障 微服务架构下的运维工作需要关注服务的...

    java基于spring注解AOP的异常处理的方法

    二、基于`@ControllerAdvice`的异常处理 `@ControllerAdvice`是Spring MVC提供的一个注解,用于定义一个全局的异常处理器,它可以捕获并处理所有`@RequestMapping`注解的方法抛出的异常。下面是一个简单的`@...

    基于Spring Boot的企业级快速开发脚手架.zip

    exception 异常处理 validator 后台校验 xss XSS过滤 config 配置信息 modules 功能模块 business 业务模块 oss 文件服务模块 sys 用户体系模块 SecdnRapidApplication 项目启动类 resources mapper...

    基于Spring Boot框架的博客系统.zip

    基于Spring Boot框架的博客系统 项目简介 secdnblog是一个基于secdnrapid开发的博客系统。它提供了丰富的功能模块,包括用户管理、文章管理、文件服务等,旨在为用户提供一个高效、易用的博客平台。 项目的主要...

    基于spring boot框架的公司考勤系统的研究与设计.docx

    ### 基于Spring Boot框架的公司考勤系统的研究与设计 #### 一、引言 随着信息技术的迅速发展和企业数字化转型的需求增加,利用现代技术手段提高企业管理效率变得尤为重要。考勤系统作为企业管理中的重要组成部分,...

    Spring5.pdf

    Spring Cloud是基于Spring Boot的一系列工具集,旨在快速建立分布式系统中的一些常见模式(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话和集群状态)。...

    spring spring security2.5 jar

    Spring Security是Spring生态体系中的一个核心组件,主要负责应用程序的安全性,包括认证和授权。它为Web应用提供了全面的保护,防止未经授权的访问和操作。在版本2.5时,Spring Security已经是一个成熟且功能丰富的...

    Spring in Action(第二版 中文高清版).part2

    5.1.1 了解Spring数据访问的异常体系 5.1.2 数据访问的模板化 5.1.3 使用DAO支持类 5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源连接池 5.2.3 基于JDBC驱动的数据源 5.3 在Spring里使用JDBC ...

    基于SSM(Spring+SpringMVC+Mybatis)框架结构的java web应用开发案例

    首先,Spring框架作为整个SSM体系的基石,它提供了一个全面的编程和配置模型,用于简化企业级Java应用程序的开发。Spring的核心特性包括依赖注入(DI)和面向切面编程(AOP),前者使得对象之间的关系可以在运行时...

    详解Spring_3.0基于Annotation的依赖注入实现

    除了将类标识为Bean外,`@Repository`还提供了一种机制来处理数据库访问异常,将其转换为Spring提供的统一异常体系,增强了代码的可读性和可维护性。 - **`@Component`**:这是一个泛用的注解,用于将任意类标记为...

    基于i18n国际化微服务统一处理错误码

    SpringBoot是Spring框架的一个子项目,它简化了创建独立的、生产级别的基于Spring的应用程序的过程。它内置了Tomcat服务器,并提供了自动配置功能,使得开发者可以快速构建应用,无需繁琐的配置。 接着,我们来看看...

    一个开放平台解决方案项目,基于Spring Cloud实现,目标让用户快速搭建自己的开放平台

    一个开放平台解决方案项目,基于Spring Cloud实现,目标让用户快速搭建自己的开放平台。通过简单的配置后,你的项目就具备了和支付宝开放平台的一样的接口提供能力。SOP封装了开放平台大部分功能包括:签名验证、...

    尚硅谷SpringCloud视频 + 源码 百度网盘

    SpringCloud是一套基于Spring Boot实现的微服务云应用开发工具集,它提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)操作的...

    spring security 3 demos

    5. **异常处理(Exception Handling)**:Spring Security 自带了一套完整的异常处理机制,包括未授权和未认证的异常。通过自定义`AccessDeniedHandler`和`AuthenticationEntryPoint`,你可以控制用户在访问受限资源...

    spring-data-elasticsearch

    12. 异常翻译:Spring Data Elasticsearch可以将Elasticsearch的原生异常翻译成Spring Data的异常体系,便于在Spring框架内进行错误处理和异常管理。 Spring Data Elasticsearch的目标是为Java开发者提供一个简单、...

    Spring Security 3多用户登录实现一

    Spring Security提供了统一的异常处理机制,如`AccessDeniedException`(访问被拒绝)和`AuthenticationException`(认证失败)。可以通过实现`AccessDeniedHandler`和`AuthenticationEntryPoint`接口来自定义异常...

    Spring security4.1 中文版参考手册 PDF版

    9. **异常处理**:Spring Security提供了一系列预定义的安全异常,如AccessDeniedException和AuthenticationException。手册会指导如何捕获和处理这些异常,以及自定义异常处理。 10. **测试支持**:Spring ...

    Spring+3.x企业应用开发实战光盘源码(全)

     第8章:介绍了Spring所提供的DAO封装层,这包括Spring DAO的异常体系、数据访问模板等内容。  第9章:介绍了Spring事务管理的工作机制,通过XML、注解等方式进行事务管理配置,同时还讲解了JTA事务配置知识。  ...

Global site tag (gtag.js) - Google Analytics