3
4

1 に答える 1

3

これは通常、メソッドに@Transactionalを設定すると、SpringがそのBeanの動的プロキシを作成するためです。Beanがインターフェイスを実装している場合は、そのインターフェイスに基づいて動的プロキシが作成されます。それ以外の場合は、プロキシの作成にCGLIBが使用されます。

あなたの場合の問題は、おそらくコントローラーを何らかのインターフェースに基づいているか、基本クラスに基づいて拡張しているためだと思います。これにより、そのインターフェイスに基づいてプロキシが作成されることになります。これは、リクエストに対してマッピングを作成するときに、SpringMVCがBeanからマッピングを検出していない可能性があるためです。

修正はいくつかあります:

a。トランザクションのプロキシをCGLIBに基づいて強制することができます。

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

b。ロードタイムウィービングまたはコンパイルタイムウィービングのいずれかで、純粋なAspectjを使用できます。

c。@Transactionalをサービス(インターフェイスを持つ)に移動し、コントローラーからサービスに呼び出しを委任できます。これにより、コントローラーでの@Transactionを回避できます。

于 2012-08-10T12:42:32.820 に答える