0

テストコード

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:transactional/batch/context.xml" })
public class TransactionTest {
@Autowired
TestBatch testBatch;

ケース 1: TestBatch は TransactionTest に正常に自動接続されます

context.xml

<context:annotation-config />
<bean id="testBatch" class="transactional.batch.TestBatch"/>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

ケース 2: しかし、このケースは失敗です。

context.xml

<context:annotation-config />
<bean id="testBatch" class="transactional.batch.TestBatch"/>
<tx:annotation-driven transaction-manager="transactionManager"/>

例外

原因: org.springframework.beans.factory.BeanCreationException: フィールドを自動配線できませんでした: transactional.batch.TestBatch transactional.batch.TransactionTest.testBatch; ネストされた例外は org.springframework.beans.factory.NoSuchBeanDefinitionException: タイプ [transactional.batch.TestBatch] の一意の Bean が定義されていません: タイプ [class transactional.batch.TestBatch] の満たされていない依存関係: 少なくとも 1 つの一致する Bean が必要です
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:435) で
    org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:105) で
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:240) で
    ... 19件以上
原因: org.springframework.beans.factory.NoSuchBeanDefinitionException: タイプ [transactional.batch.TestBatch] の一意の Bean が定義されていません: タイプ [class transactional.batch.TestBatch] の満たされていない依存関係: 少なくとも 1 つの一致する Bean が必要です
    org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:613) で
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:412) で
    ... 21以上

唯一の違いはtx:annotation-drivenproxy-target-class属性です。

なぜtx:annotation-drivenオートワイヤーを制御するのですか?

4

1 に答える 1

0

私の推測ではTestBatch、インターフェイスを実装し、@Transactionalそのメソッドのいくつかを持っています。

<tx:annotation-driven>のトランザクション プロキシ オブジェクトを生成しますTestBatch。デフォルトでは、TestBatchインターフェイスを実装する場合、このプロキシ オブジェクトはそれらのインターフェイスを実装しますが、TestBatch. If you useproxyTargetClass , then the generated proxy object will instead subclassTestBatch` を拡張しません。

単体テストではオブジェクトがタイプTestBatchである必要があるため、構成で使用する必要がありproxyTargetClassます。または、単体テストを変更して、型を直接使用するTestBatchのではなく、 のインターフェイスのいずれかを使用します。TestBatch

于 2012-05-16T08:22:08.777 に答える