0

我正在实施 Spring 旧的声明性 TX 技术

这是我的目标 DAO 对象:

必要的进口..

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 :)");
}

}

应用程序上下文.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);
}

}

当我执行我的应用程序时,我收到了这个错误:

线程“主”java.lang.ClassCastException 中的异常:$Proxy0 无法在 SpringTxTestCase.main 中转换为 com.gagan.dao.UserDAOImpl(SpringTxTestCase.java:14)

我已经在 applicationContext.xml 中正确配置了指向我的 com.gagan.dao.UserDAOImpl 的 org.springframework.aop.framework.ProxyFactoryBean 但我很困惑为什么会出现 ClassCastException 错误。

提前致谢, 加根

4

1 回答 1

1

使用 Spring 代理您的 DAO impl 类不会产生 impl 类的实例。它产生的东西实现了与该类相同的接口。因此,您永远不能将其转换为 impl 类,只能转换为接口。这是因为 Spring 在底层使用JDK 动态代理(默认情况下)。由于您实际上没有 DAO 接口,因此您的代理对您来说几乎毫无用处。给DAO添加一个接口,通过接口引用。

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

于 2013-01-28T17:15:50.137 回答