在集成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事务管理详解 在Java应用开发中,事务管理是一个重要的环节,特别是在处理数据库操作时。Spring框架提供了强大的事务管理机制,使得开发者能够方便地控制事务的开启与提交。然而,在实际开发过程中,经常...
Spring+SpringMVC配置事务管理无效原因及解决办法详解 Spring 框架是 Java 企业级应用程序的核心框架,提供了事务管理机制,以确保业务逻辑的原子性和一致性。然而,在使用 Spring 和 SpringMVC 配置事务管理时,...
- @Transactional注解只能在由Spring管理的bean(即@Component、@Service、@Repository、@Controller等)中使用,否则注解将无效。 - 如果在AOP代理模式下使用(如JDK动态代理或CGLIB代理),注解应该应用在接口...
1. **增强的事务管理**:Spring Batch 4.0.0 对事务管理进行了优化,支持更灵活的事务边界定义,允许开发者根据需要调整步进事务的粒度。 2. **元数据存储升级**:此版本对元数据存储进行了优化,支持更多的数据库...
在Spring框架中,AOP用于实现横切关注点,如日志记录、事务管理、性能监控等。通过AOP,开发者可以将这些通用功能模块化,独立于业务逻辑,从而提高代码的可维护性和复用性。 接下来是`aspectjweaver.jar`,这是...
- **脏读(Dirty Read)**:事务A读取了事务B还未提交的数据,如果B事务回滚,A读到的数据是无效的。在Oracle中,脏读是不允许的。 - **不可重复读(Unrepeatable Read)**:事务A在不同时间读取了同一数据的不同...
在Spring事务管理中,事务隔离级别是一个非常重要的概念,它定义了事务在并发执行时如何避免互相干扰和保持数据一致性。今天,我们将详细介绍Spring中的事务隔离级别,了解其特性和解决的问题。 事务简介 -------- ...
Spring框架中的@Transactional注解是用来实现事务管理的,但是有时候我们可能会遇到@Transactional注解无效的情况。在这篇文章中,我们将 introducethe 解决方案,并通过示例代码对其进行详细的介绍。 首先,让我们...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现横切关注点,如日志、事务管理、性能监控等,而无需侵入业务代码。下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### ...
它们分别负责不同的职责:Spring MVC 用于构建Web应用程序的模型-视图-控制器(MVC)架构,Spring 4 提供了全面的服务层支持,包括依赖注入、AOP(面向切面编程)以及事务管理等,而Hibernate 5 是一个对象关系映射...
通过在bean属性上添加注解如`@NotNull`、`@Size`等,可以在处理表单提交时自动执行验证,避免无效数据进入系统。此外,Spring MVC还提供了一套与前端交互的验证机制,如`@Validated`注解和自定义验证器。 2. **依赖...
通过Spring的声明式事务管理,可以在服务层方法上添加@Transactional注解,实现事务的自动管理。此外,Spring还提供了一些便捷的工具,如HibernateTemplate或JdbcTemplate,简化了DAO(数据访问对象)层的编写。 ...
Spring AOP是Spring框架的一部分,它提供了一种在运行时织入横切关注点(如日志、事务管理等)到目标对象的能力。AOP的核心概念包括切面(Aspect)、连接点(Join Point)、通知(Advice)、切入点(Pointcut)和织...
Spring作为轻量级的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器,提供了一个统一的管理组件的方式,包括数据访问、事务管理等。Hibernate则是一个强大的ORM(Object-Relational Mapping)...
如果项目中缺少这两个jar包,可能会导致Spring的一些核心功能无法正常工作,如AOP代理的创建失败,进而影响到事务管理、日志记录等关键特性。因此,确保这些依赖项正确地包含在项目构建路径或Maven/Gradle的依赖管理...
综上所述,"Redis+mysql整合spring的Demo"项目涵盖了数据库集成、缓存策略、事务管理等多个核心知识点,是学习和实践数据存储和高性能应用的好资源。通过对这些内容的理解和实践,开发者可以更好地应对复杂的企业级...
Spring是一个广泛使用的Java应用框架,提供了依赖注入、面向切面编程、事务管理等功能,同时也支持多种集成技术,如WebSocket、HTTP长轮询等,用于实现消息推送。 将DWR与Spring结合,可以创建出高效且易于维护的...