2012-05-16 2 views
0

TestCodeSpring 2,5 SpringJUnit4ClassRunner не autowire при ОМ: аннотации привода используется

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

Исключение

 
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 «s proxy-target-class атрибутов.

Почему tx:annotation-driven управлять автомобильным проводом?

+0

ну, мне кажется, что это не то, что «tx: управляемый аннотацией автоматический провод». Но вместо этого на основе стека класс автопроксирования имеет тот же идентификатор 'Нет уникального компонента типа [transactional.batch.TestBatch]'. Почему вы не пытаетесь использовать [@Qualifier] (http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-autowired-annotation-qualifiers)? – maverick

ответ

0

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

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

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