Spring 2.5 SpringJUnit4ClassRunner не может автоматически подключаться, когда используется tx:annotation-driven

ТестКод

@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"/>

Исключение

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: transactional.batch.TestBatch transactional.batch.TransactionTest.testBatch; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [transactional.batch.TestBatch] is defined: Unsatisfied dependency of type [class transactional.batch.TestBatch]: expected at least 1 matching bean
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:435)
    at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:105)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:240)
    ... 19 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [transactional.batch.TestBatch] is defined: Unsatisfied dependency of type [class transactional.batch.TestBatch]: expected at least 1 matching bean
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:613)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:412)
    ... 21 more

Отличие только в атрибуте tx:annotation-driven proxy-target-class.

Зачем tx:annotation-driven управлять автопроводом?


person narusas    schedule 16.05.2012    source источник
comment
ну мне кажется что дело не в том что tx:annotation-driven управляет авто проводом. Но вместо этого на основе стека автоматически проксируемый класс имеет тот же идентификатор No unique bean of type [transactional.batch.TestBatch]. Почему вы не пытаетесь использовать @Квалификатор ?   -  person maverick    schedule 16.05.2012


Ответы (1)


Я предполагаю, что TestBatch реализует интерфейс и имеет @Transactional в некоторых своих методах.

<tx:annotation-driven> создаст транзакционный прокси-объект для TestBatch. По умолчанию, если TestBatch реализует какие-либо интерфейсы, то этот прокси-объект будет реализовывать эти интерфейсы, но не будет расширять TestBatch. If you useproxyTargetClass, then the generated proxy object will instead subclassTestBatch`.

Поскольку ваш модульный тест требует, чтобы объект был типа TestBatch, это означает, что вы должны использовать proxyTargetClass в своей конфигурации. В качестве альтернативы измените свой модульный тест, чтобы использовать один из интерфейсов TestBatch, а не напрямую тип TestBatch.

person skaffman    schedule 16.05.2012