获取ProxyObject时的Spring声明事务 - ClassCastException

时间:2013-01-28 17:07:58

标签: spring transactions declaration classcastexception

我正在实现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

1 个答案:

答案 0 :(得分:1)

使用Spring代理您的DAO impl类不会产生impl类的实例。它产生的东西实现了与该类相同的接口。因此,您永远不能将它转换为impl类,只能转换为接口。那是因为Spring在引擎盖下使用JDK dynamic proxies(默认情况下)。由于您实际上没有DAO接口,因此您的代理对您来说几乎没用。将接口添加到DAO并通过接口引用它。

更新:哦,我还应该注意到DAO几乎从来就不是交易边界的合适位置。它们属于您的“服务”层,除了极少数情况,因为事务反映了业务工作单元,而不是持久性工作单元。