0

测试代码

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

案例 1:TestBatch 自动连接到 TransactionTest 成功

上下文.xml

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

案例2:但是这个案例失败了。

上下文.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-driven'proxy-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`。

由于您的单元测试要求对象是 type TestBatch,这意味着您必须proxyTargetClass在配置中使用。或者,更改您的单元测试以使用其中一个TestBatch接口,而不是TestBatch直接使用类型。

于 2012-05-16T08:22:08.777 回答