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

}

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をSpringTxTestCase.main(SpringTxTestCase.java:14)のcom.gagan.dao.UserDAOImplにキャストできません

applicationContext.xmlのcom.gagan.dao.UserDAOImplを指すorg.springframework.aop.framework.ProxyFactoryBeanを適切に構成しましたが、ClassCastExceptionエラーが発生した理由がわかりません。

よろしくお願いします、Gagan

4

1 に答える 1

1

Springを使用してDAOimplクラスをプロキシしても、implクラスのインスタンスは生成されません。そのクラスと同じインターフェイスを実装するものが生成されます。したがって、これをimplクラスにキャストすることはできず、インターフェイスにのみキャストできます。これは、Springが内部でJDK動的プロキシを使用しているためです(デフォルト)。実際にはDAOインターフェースを持っていないので、プロキシはほとんど役に立ちません。DAOにインターフェースを追加し、インターフェースを介して参照します。

更新:ああ、DAOがトランザクション境界に適した場所になることはほとんどないことにも注意する必要があります。トランザクションが永続化作業の単位ではなくビジネス作業の単位を反映しているため、まれなケースを除いて、これらは「サービス」レイヤーに属します。

于 2013-01-28T17:15:50.137 に答える