`
gary_bu
  • 浏览: 43085 次
  • 性别: 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 + spring + hibernate + bootstrap开发图书管理系统

    在实际开发过程中,首先会设置项目环境,包括搭建Spring Boot框架,配置相关的Spring MVC、Spring和Hibernate模块。接着,设计数据库模型,创建实体类并利用Hibernate的注解进行映射。然后,建立数据访问层(DAO),...

    spring mvc + spring + hibernate 全注解整合开发视频教程 11

    在这个视频教程中,你可能将学习到如何配置Spring的XML上下文文件以启用注解驱动的配置,如何在Spring MVC中创建注解式的控制器并处理HTTP请求,以及如何通过Hibernate的注解来设计数据模型并执行CRUD操作。...

    spring mvc + spring + hibernate 全注解整合开发视频教程 04

    Spring还提供了数据源配置、事务配置以及对Hibernate SessionFactory的管理,通过`@EnableTransactionManagement`开启事务管理。 在实际开发中,我们还会用到Spring的其他功能,比如Spring MVC的拦截器...

    spring mvc案例+配置+原理详解+架包

    这个压缩包包含了关于Spring MVC的案例、配置和原理的详细资料,对于初学者来说,是深入理解该框架的良好资源。 一、Spring MVC 基本概念 1. **模型-视图-控制器(MVC)**:MVC是一种设计模式,将业务逻辑、数据...

    spring mvc + spring + hibernate 全注解整合开发视频教程 10

    3. 配置和使用Spring的事务管理,了解如何通过@Transactional注解处理异常时的回滚逻辑。 4. 整合Hibernate的实体类和表之间的映射,学习如何通过注解定义实体属性和关系。 5. 错误和异常处理,包括自定义异常处理器...

    maven+spring MVC+Mybatis+jetty+mysql

    Spring MVC 提供了处理HTTP请求、路由、数据绑定、验证和异常处理等功能。开发者可以使用注解驱动的方式简化配置,例如@Controller、@RequestMapping等。此外,Spring MVC 可以与Spring框架的其他模块无缝集成,如...

    spring mvc + spring + hibernate 全注解整合开发视频教程 13

    在Spring MVC中,注解的使用可以极大地简化配置,例如@Controller、@RequestMapping、@Autowired等,它们使得控制器、请求映射和依赖注入变得更为直观。 Spring框架的核心在于它的依赖注入(DI)和面向切面编程...

    Spring mvc+hibernate+mysql Demo

    测试可能涵盖了CRUD操作,以及异常处理和事务管理等核心功能。 总的来说,Spring MVC、Hibernate和MySQL的整合提供了一种高效且灵活的Web开发模式,允许开发者专注于业务逻辑,而无需过于关注底层数据访问细节。这...

    spring mvc+spring+maven框架项目,纯净项目

    它提供了模型绑定、数据验证、RESTful支持、异常处理等特性,帮助开发者更有效地组织和管理控制器逻辑。Spring MVC通过DispatcherServlet接收请求,分发到相应的处理器,并将结果返回给视图。视图通常由JSP、...

    Spring mvc + Spring + Spring jdbc 整合实例源码

    在Spring MVC和Spring整合中,我们可以通过XML配置或Java配置来定义Bean及其依赖关系。例如,我们可以定义一个Service Bean,然后在Controller中通过@Autowired注解自动注入,实现业务逻辑的调用。 最后,Spring ...

    spring +spring mvc+mybatis +bootstrap 基本整合

    10. **错误和异常处理**:学习如何配置Spring MVC的全局异常处理器,优雅地处理运行时异常。 这个项目是学习和实践Java Web开发的一个很好的起点,涵盖了从后端服务到前端展示的关键技术,对于初学者来说,这是一个...

    通用开发平台(spring mvc + spring + bootstrap + hibernate)

    Spring MVC的核心功能包括视图解析、模型绑定、数据验证和异常处理,通过依赖注入(DI)和面向切面编程(AOP)提供灵活的架构。 2. Spring:Spring框架是Java企业级应用开发的基石,它提供了一整套服务,包括IoC...

    企业级员工信息管理系统 spring mvc + spring + hibernate + bootstrap + maven.zip

    首先,Spring MVC作为系统的核心控制器,负责处理来自用户的请求,通过模型-视图-控制器(MVC)设计模式,将业务逻辑、数据展示和用户交互分离,提高了代码的可读性和可维护性。Spring框架则提供了依赖注入(DI)和...

    Spring mvc + Spring + Spring jdbc 整合 demo.rar

    3. **Spring JDBC**:Spring JDBC提供了一个JdbcTemplate类,它封装了JDBC的繁琐操作,如打开和关闭连接、处理异常等,使得开发者可以专注于SQL语句的编写。此外,它还支持RowMapper和ResultSetExtractor,用于将...

    spring mvc + spring + hibernate 全注解整合开发视频教程 09

    【标题】"Spring MVC + Spring + Hibernate 全注解整合开发视频教程 09" 提供了一次深入了解Java企业级应用开发的机会,特别是在使用Spring MVC、Spring和Hibernate这三大核心框架进行全注解配置的场景下。...

    spring + spring mvc + hibernate + mysql 整合开发任务流程后台管理系统

    4. 配置Spring MVC:定义DispatcherServlet、配置视图解析器、编写Controller,处理前端请求。 5. 集成Hibernate:配置Hibernate的SessionFactory,实现数据持久化,编写DAO层来处理数据操作。 6. 开发业务逻辑:...

    搭建spring mvc+spring+ibatis所需所有jar包

    Spring MVC作为Spring框架的一部分,主要用于处理Web请求,Spring则提供全面的依赖注入和面向切面编程功能,而iBatis则是一个优秀的持久层框架,它简化了数据库操作。以下是关于这三个框架及其集成使用的关键知识点...

    spring mvc + mybitis + mysql集成例子,带数据库

    7. **错误和异常处理**:使用Spring的@ControllerAdvice和@ExceptionHandler注解可以全局处理错误和异常,提高用户体验。 通过这个集成例子,开发者可以学习到如何将这三个组件有效地整合在一起,创建一个功能完善...

    注册表单spring MVC+hibernate+spring+easyui

    - 错误处理:使用Spring MVC的异常处理器捕获并处理可能出现的异常,返回合适的错误信息。 - 安全性:考虑使用HTTPS协议、密码加密存储、SQL注入防护等措施,增强系统的安全性。 7. **优化与扩展**: - 可以结合...

Global site tag (gtag.js) - Google Analytics