`
duan1823a
  • 浏览: 90856 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring事物无效

阅读更多
在集成spring、ibatis和struts2时碰到一些问题,做个记录
spring 配置文件:好用的
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="
	     http://www.springframework.org/schema/beans
	     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	     http://www.springframework.org/schema/context
	     http://www.springframework.org/schema/context/spring-context-2.5.xsd
	     http://www.springframework.org/schema/aop
	     http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
	     http://www.springframework.org/schema/tx
	     http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
		">
		
	<!-- 使用注解 -->
	<context:annotation-config/>
	
	<!-- 声明:使用标签配置事物处理(通知) -->
	<tx:annotation-driven transaction-manager="txManager"/>
	
	<bean id="placeholderConfig"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location">
			<value>classpath:jdbc.properties</value>
		</property>
	</bean>
	
	<!-- c3p0 数据源 --> 
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="user" value="${datasource.username}"></property>
		<property name="password" value="${datasource.password}"></property>
		<property name="jdbcUrl" value="${datasource.url}"></property>
		<property name="driverClass" value="${datasource.driverClassName}"></property>
	</bean>
	
	<!-- 事物处理器 -->
	<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource">
			<ref local="dataSource" />
		</property>
	</bean>
	 
	<!-- 得到 spring.sqlMapClient -->
	<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
		<property name="configLocation" value="classpath:SqlMapConfig.xml" />
		<property name="dataSource" ref="dataSource" />
	</bean>
	<bean id="ibatisTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
		<property name="sqlMapClient" ref="sqlMapClient" />
	</bean>

<!-- 测试 -->
  <bean id="com.trans.ServiceImpl" class="com.trans.ServiceImpl"></bean>
  <bean id="filter.Test" class="filter.Test" scope="singleton"></bean>
</beans>

要让标签起作用,被标记事物的类必须是被spring管理的

一:首先遇到的问题就是一打上@Transactional标签就报 spring 创建bean出错:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
结果发现是在这些类里面的静态变量问题,比如:
public static ContactUsersServiceImpl c = (ContactUsersServiceImpl) SpringHelper
			.getBean(ContactUsersServiceImpl.class)
把它换成用get方法获取就可以了
可能是因为调用顺序之类的引发的错误,没看过源码不知道啥原因,改掉就没事了

二:使用事物标签的类必须有接口继承,比如
在action中调用:ServersServiceImpl.getServiceObj().test();

public class ServersServiceImpl extends BaseServiceSupport implements ServersService{
	public static ServersService getServiceObj() {
		return (ServersService) SpringHelper.getBean(ServersServiceImpl.class);
	}
	
	@Transactional
	public void test(){
		Servers ss = new Servers();

		ss.setId(UUID.randomUUID().toString().replace("-", ""));
		ss.setName("测试2");
		ss.setServerIP("111.11.1.1");
		ss.setServerType("1");
		ss.setTcpPort(99);
		ss.setUdpPort(999);

		try {
			ServersServiceImpl.getServiceObj().insertObject(ss);
			
			System.out.println("...11...");
			int a = 1 / 0;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
其中的test方法必须在接口中有定义,还有getServiceObj()方法返回的值:(ServersService) SpringHelper.getBean(ServersServiceImpl.class),必须是转型为接口,所以才必须在接口中得有事物定义的方法。不转型为接口会报$Proxy5 cannot be cast to com.tmg.aec.user.service.impl.ServersServiceImpl 这个错。
网上找到个说法是这样的:
------------------
Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to  (类型转换错误)

spring的文档中这么写的:Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理,如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理。使用beanNameAutoProxyCreator来进行事务代理的话,他的proxyTargetClass这个属性设置为false(默认是false),即使用JDK动态代理,如果你的service类没有实现接口的话,就会报类型转换错误。

解决办法有:

1、给service类添加一个接口iService,让service类实现它,则创建代理类时使用JDK动态代理就不会出现问题

2、设置beanNameAutoProxyCreator的proxyTargetClass属性为true,意思是强制使用CGLIB代理,前提是你已经将CGLIB包加入到项目中
------------------

还有个问题是int a = 1 / 0;如果被try/catch事物就不会回滚,还没搞明白怎么回事!!


先记着,做个备忘!


分享到:
评论

相关推荐

    spring事务总结.docx

    ### Spring事务管理详解 在Java应用开发中,事务管理是一个重要的环节,特别是在处理数据库操作时。Spring框架提供了强大的事务管理机制,使得开发者能够方便地控制事务的开启与提交。然而,在实际开发过程中,经常...

    Spring+SpringMVC配置事务管理无效原因及解决办法详解

    Spring+SpringMVC配置事务管理无效原因及解决办法详解 Spring 框架是 Java 企业级应用程序的核心框架,提供了事务管理机制,以确保业务逻辑的原子性和一致性。然而,在使用 Spring 和 SpringMVC 配置事务管理时,...

    spring基于注解实现事务

    - @Transactional注解只能在由Spring管理的bean(即@Component、@Service、@Repository、@Controller等)中使用,否则注解将无效。 - 如果在AOP代理模式下使用(如JDK动态代理或CGLIB代理),注解应该应用在接口...

    spring-batch包

    1. **增强的事务管理**:Spring Batch 4.0.0 对事务管理进行了优化,支持更灵活的事务边界定义,允许开发者根据需要调整步进事务的粒度。 2. **元数据存储升级**:此版本对元数据存储进行了优化,支持更多的数据库...

    spring 需要的jar

    在Spring框架中,AOP用于实现横切关注点,如日志记录、事务管理、性能监控等。通过AOP,开发者可以将这些通用功能模块化,独立于业务逻辑,从而提高代码的可维护性和复用性。 接下来是`aspectjweaver.jar`,这是...

    Spring_事务基础知识[归纳].pdf

    - **脏读(Dirty Read)**:事务A读取了事务B还未提交的数据,如果B事务回滚,A读到的数据是无效的。在Oracle中,脏读是不允许的。 - **不可重复读(Unrepeatable Read)**:事务A在不同时间读取了同一数据的不同...

    Spring中的事务隔离级别的介绍

    在Spring事务管理中,事务隔离级别是一个非常重要的概念,它定义了事务在并发执行时如何避免互相干扰和保持数据一致性。今天,我们将详细介绍Spring中的事务隔离级别,了解其特性和解决的问题。 事务简介 -------- ...

    spring @Transactional 无效的解决方案

    Spring框架中的@Transactional注解是用来实现事务管理的,但是有时候我们可能会遇到@Transactional注解无效的情况。在这篇文章中,我们将 introducethe 解决方案,并通过示例代码对其进行详细的介绍。 首先,让我们...

    spring aop注解方式、xml方式示例

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现横切关注点,如日志、事务管理、性能监控等,而无需侵入业务代码。下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### ...

    springmvc+spring4+hibernate5

    它们分别负责不同的职责:Spring MVC 用于构建Web应用程序的模型-视图-控制器(MVC)架构,Spring 4 提供了全面的服务层支持,包括依赖注入、AOP(面向切面编程)以及事务管理等,而Hibernate 5 是一个对象关系映射...

    Spring的约束资源

    通过在bean属性上添加注解如`@NotNull`、`@Size`等,可以在处理表单提交时自动执行验证,避免无效数据进入系统。此外,Spring MVC还提供了一套与前端交互的验证机制,如`@Validated`注解和自定义验证器。 2. **依赖...

    maven与spring MVC

    通过Spring的声明式事务管理,可以在服务层方法上添加@Transactional注解,实现事务的自动管理。此外,Spring还提供了一些便捷的工具,如HibernateTemplate或JdbcTemplate,简化了DAO(数据访问对象)层的编写。 ...

    spring aop实例annotation方法实现

    Spring AOP是Spring框架的一部分,它提供了一种在运行时织入横切关注点(如日志、事务管理等)到目标对象的能力。AOP的核心概念包括切面(Aspect)、连接点(Join Point)、通知(Advice)、切入点(Pointcut)和织...

    spring3 hibernate4 ehcache实例

    Spring作为轻量级的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器,提供了一个统一的管理组件的方式,包括数据访问、事务管理等。Hibernate则是一个强大的ORM(Object-Relational Mapping)...

    spring 缺失jar包

    如果项目中缺少这两个jar包,可能会导致Spring的一些核心功能无法正常工作,如AOP代理的创建失败,进而影响到事务管理、日志记录等关键特性。因此,确保这些依赖项正确地包含在项目构建路径或Maven/Gradle的依赖管理...

    Redis+mysql整合spring的Demo

    综上所述,"Redis+mysql整合spring的Demo"项目涵盖了数据库集成、缓存策略、事务管理等多个核心知识点,是学习和实践数据存储和高性能应用的好资源。通过对这些内容的理解和实践,开发者可以更好地应对复杂的企业级...

    使用dwr+spring实现消息推送

    Spring是一个广泛使用的Java应用框架,提供了依赖注入、面向切面编程、事务管理等功能,同时也支持多种集成技术,如WebSocket、HTTP长轮询等,用于实现消息推送。 将DWR与Spring结合,可以创建出高效且易于维护的...

Global site tag (gtag.js) - Google Analytics