我正在实现Spring旧的声明性TX技术
这是我的目标DAO对象:
neccesary imports ..
public class UserDAOImpl extends JdbcDaoSupport {
public void add(int id, String name, Float salary){
System.out.println("add");
String SQL = "insert into User_Details (id, name, salary) values (?, ?, ?)";
getJdbcTemplate().update(SQL, id, name, salary);
getJdbcTemplate().update(SQL, id, name, salary);
getJdbcTemplate().update(SQL, id, name, salary);
throw new java.lang.RuntimeException("Exception occurs :)");
}
}
的applicationContext.xml:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="add">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="userDetailProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="userDetailDAOImpl" />
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<bean id="userDetailDAOImpl" class="com.gagan.dao.UserDAOImpl">
<property name="dataSource" ref="dataSource" />
主类:
进口..
public class SpringTxTestCase {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDAOImpl ud=(UserDAOImpl)context.getBean("userDetailProxy");
ud.add(101,"Rahul", 1233.6f);
}
}
当我执行我的应用程序时出现此错误:
线程“main”中的异常java.lang.ClassCastException:$ Proxy0无法强制转换为com.gagan.dao.UserDAOImpl 在SpringTxTestCase.main(SpringTxTestCase.java:14)
我已正确配置org.springframework.aop.framework.ProxyFactoryBean指向applicationContext.xml中的com.gagan.dao.UserDAOImpl,但我很困惑,为什么我收到ClassCastException错误。
提前致谢, GAGAN
答案 0 :(得分:1)
使用Spring代理您的DAO impl类不会产生impl类的实例。它产生的东西实现了与该类相同的接口。因此,您永远不能将它转换为impl类,只能转换为接口。那是因为Spring在引擎盖下使用JDK dynamic proxies(默认情况下)。由于您实际上没有DAO接口,因此您的代理对您来说几乎没用。将接口添加到DAO并通过接口引用它。
更新:哦,我还应该注意到DAO几乎从来就不是交易边界的合适位置。它们属于您的“服务”层,除了极少数情况,因为事务反映了业务工作单元,而不是持久性工作单元。