`
gary_bu
  • 浏览: 42080 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

spring mvc 事务配置+异常处理

阅读更多

http://gary-bu.iteye.com/blog/2024022  中我们了解了如何配置一个springmvc,如何在spring配置文件中配置一个dbcp数据源,在web.xml配置上下文监听器,分发器,视图解析器等,而这篇主要看一下如何在上次的基础上配置事务.

spring事务分声明式事务和编程式事务,我们今天主要说一下声明式事务,spirng的事务是通过AOP代理实现的,其中的事务通知 由原数据(目前基于XML或者注解)驱动.代理对象与事务元数据结合产生了一个AOP代理,它使用一个PlatformTransactionManager实现 配合TransactionInterceptor在方法调用前后实施事务.

第一种实现,基于XML的配置:

基于jdbc连接,所以需要配置一个DataSourceTransactionManager,然后指定数据源

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="jdbcDataSource" />

 配置事务通知,指定transactionManager,设定所有方法都走事务,并且get开头的方法只读,我们来看几个关键属性,

1.propagation:事务传播,取值

 REQUIRED:为每一个被应用的方法创建一个逻辑事务作用域.

 REQUIRES_NEW:为每一个相关的作用域使用一个完全独立的事务,在这种情况下物理事务也是不同的因此外部事务可以不受内部事务回滚的影响独立提交或回滚.

 SUPPORTS:如果存在一个事务, 支持当前事务. 如果没有事务, 则非事务的执行

 NOT_SUPPORTED:总是非事务地执行, 并挂起任何存在的事务

 NEVER:总是非事务地执行, 如果存在一个活动事务, 则抛出异常

 NESTED:使用了单独的物理事务,这个事务拥有多个可以回滚的保存点,这样部分会滚允许内部事务在它的作用域内触发一个回滚,并且外部事务可以不受影响继续,这通常对应于JDBC的保存点,所以

 只在JDBC 资源管理事务管理上起效.

 MANDATORY:如果已经存在一个事务, 支持当前事务. 如果没有一个活动的事务, 则抛出异常. 

2.get方法设置read-only,因此数据库将会为只读事务提供一些优化手段.

 

<tx:advice id="txAdvice" transaction-manager="transactionManager">
	<tx:attributes>
		<tx:method name="*" propagation="REQUIRED"/>
		<tx:method name="get*" read-only="true"/>
	</tx:attributes>
</tx:advice>

 AOP配置:

 配置切入点,切入点表达式详情请参考http://blog.csdn.net/archie2010/article/details/6254343

 配置advisor ,指定事务通知,指定切入点

<aop:config>
	<!-- 切入点表达式  -->
	<aop:pointcut id="txPointcut" expression="excution(* com.xg.myspring.service..*.*(..))"/>
	<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>

 现在基于XML的事务配置就完成了,在编写方法的时候注意命名规则就好了

注意需要在lib中添加aspectweaver.jar包

 

 

第二种实现,基于注解

 这种配置相对简单,但是要在代码中进行注解

配置代码,只需要在注解驱动中指定事务管理

<!-- 注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

 然后就是在代码中添加注解,举个例子:

package com.xg.myspring.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.xg.myspring.dao.SystemUserDao;
import com.xg.myspring.entity.SystemUser;
import com.xg.myspring.service.SystemUserService;

@Service
@Transactional(propagation = Propagation.REQUIRED)
public class SystemUserServiceImpl implements SystemUserService {

	@Resource
	private SystemUserDao systemUserDao;

	public List<SystemUser> queryUserList(String sql) {
		systemUserDao.addSystemUser(new SystemUser());
		if (2 > 1) {
			throw new NullPointerException();
		}
		return systemUserDao.queryUserList(sql);
	}

}

 上面的代码中,注意看红色部分,给整个类下所有方法添加了REQUIRED的事务,然后故意在queryUserList方法中抛出异常,查看事务执行情况,数据是不会提交的.

 当然你也可以把事务注解添加在方法上.

 

 

项目运行时报异常在所难免,spring提供了异常处理机制,来增加我们界面的友好性.接下来,我们看一下如何配置

<!-- 异常处理 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
	<property name="exceptionMappings">
		<props>
			<prop key="java.lang.Exception">errors/error</prop>
		</props>
	</property>
	<property name="defaultErrorView" value="errors/error"></property>
	<!-- 处理异常后打印日志 -->
	<property name="warnLogCategory" value="ERROR"></property>
</bean>

 

说明:

1、defaultErrorView, 当没有配置异常处理映射时,该默认视图将起作用

2、exceptionMappings 异常处理映射Property,key=“异常名称”, vlaue=异常处理视图

3、warnLogCategory 捕获异常后打印异常日志

 

另外对于Unchecked Exception 由于代码不强制捕获,往往被忽略,如果运行期产生了Unchecked Exception,就会出现404、500……等服务器内部错误提示页面。 

目前大多数服务器也都支持在web.xml中通过<error-page>指定异常情况的显示页面。修改web.xml文件,增加以下内容: 

<!-- 对Unchecked 异常处理 -->
<error-page>
	<exception-type>java.lang.Throwable</exception-type>
	<location>/page/errors/error.jsp</location>
</error-page>
<error-page>
	<error-code>404</error-code>
	<location>/page/errors/error_404.jsp</location>
</error-page>
<error-page>
	<error-code>500</error-code>
	<location>/page/errors/error_500.jsp</location>
</error-page>

我们可以模拟一下404错误,在进行页面跳转的时候把页面写错,这样通过上述配置就可以成功跳转到我们预设的404页面了.

这样异常处理就完整了,附件更新了demo代码,文章讲的不清楚的地方可以下载看看.

 

 那天看到有人在讨论,在事务回滚的时候想添加一下日志信息,结果却添加不进去因为一起回滚了,看了一下资料,好像需要对事务做一些配置,想亲自实践一下,就在下篇文章记录一下吧.

 

分享到:
评论

相关推荐

    使用spring mvc+c3p0+jpa 框架搭建环境

    本基础框架采用 spring mvc+c3p0+jpa的配置方式,里面配置了spring事务管理,异常处理,登陆拦截器 等,全部自己动手搭建,经过测试通过。如果你苦于一个万能的java ee框架搭建,你可以参考。个人喜欢专研技术,但不...

    JavaEE开发的颠覆者+Spring+Boot实战++完整版

    而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。, 《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而...

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

     第9章:介绍了Spring事务管理的工作机制,通过XML、注解等方式进行事务管理配置,同时还讲解了JTA事务配置知识。  第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再有...

    spring4.3.2参考文档(英文)

    Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    8.4.4 改变异常处理的方式 8.5 小结 第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 9.3.1 添加CVS资源库 9.3.2 提交...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第9章:介绍了Spring事务管理的工作机制,通过XML、注解等方式进行事务管理配置,同时还讲解了JTA事务配置知识。  第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再...

    spring.doc

    不用spring异常通知,另一种处理异常 96 4.2.2.2Aop注解形式(了解) 99 注解注入拓展: 103 5 Spring数据库 106 5.1 Spring+JDBC 106 5.1.1 Jdbc编程特点 106 5.1.2引入DataSource 106 5.1.3 核心类JdbcTemplate ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而...

    Spring.3.x企业应用开发实战(完整版).part2

    2.5.1 配置Spring MVC框架 2.5.2 处理登录请求 2.5.3 JSP视图页面 2.6 运行Web应用 2.7 小结 第2篇 IoC和AOP 第3章 IoC容器概述 3.1 IoC概述 3.1.1 通过实例理解IoC的概念 3.1.2 IoC的类型 3.1.3 通过容器完成依赖...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言...

    Spring 2.0 开发参考手册

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. ...

    spring in action英文版

     5.1.2 理解Spring对事务管理的支持  5.1.3 介绍Spring的事务管理器  5.2 在Spring中编写事务  5.3 声明式事务  5.3.1 理解事务属性  5.3.2 声明一个简单的事务策略  5.4 通过方法名声明事务 ...

    Spring中文帮助文档

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere 事务管理的完整支持 2.4.3. JPA 2.4.4. 异步的JMS 2.4.5. JDBC 2.5. Web层 2.5.1. Spring MVC合理的默认值 2.5.2. Portlet 框架 2.5.3. 基于...

    Spring3.x企业应用开发实战(完整版) part1

    2.5.1 配置Spring MVC框架 2.5.2 处理登录请求 2.5.3 JSP视图页面 2.6 运行Web应用 2.7 小结 第2篇 IoC和AOP 第3章 IoC容器概述 3.1 IoC概述 3.1.1 通过实例理解IoC的概念 3.1.2 IoC的类型 3.1.3 通过容器完成依赖...

    Spring API

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere 事务管理的完整支持 2.4.3. JPA 2.4.4. 异步的JMS 2.4.5. JDBC 2.5. Web层 2.5.1. Spring MVC合理的默认值 2.5.2. Portlet 框架 2.5.3. 基于...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    8.4.4 改变异常处理的方式 8.5 小结 第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 9.3.1 添加CVS资源库 9.3.2 提交...

    spring chm文档

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. ...

Global site tag (gtag.js) - Google Analytics