Класс Autowire, расширяющий класс не контейнеров - PullRequest
2 голосов
/ 19 апреля 2011

У меня есть следующая структура:

@Component public abstract class
HuginJob extends QuartzJobBean {...}


@Component("CisxJob") public class
CisxJob extends HuginJob {...}

Теперь я хочу протестировать CisxJob:

 @RunWith(SpringJUnit4ClassRunner.class)

 @ContextConfiguration({"/applicationContext-test.xml" })

public class CisxJobTest {

     @Autowired
     @Qualifier("CisxJob")
     private CisxJob          cisxJob;
..... }

Вот часть applicationContext-test.xml

<context:annotation-config />
<context:component-scan base-package="no.hugin.jobscheduler" />

Ошибка

org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем no.hugin.jobscheduler.job.cisx.CisxJobTest: не удалось внедрить зависимостей с автопроводкой; вложенным исключением является rg.springframework.beans.factory.BeanCreationException: Не удалось автоматически связать поле: private no.hugin.jobscheduler.job.cisx.CisxJob no.hugin.jobscheduler.job.cisx.CisxJobTest.cisxJob; Вложенным исключением является org.springframework.beans.factory.NoSuchBeanDefinitionException: Не найден соответствующий компонент типа [no.hugin.jobscheduler.job.cisx.CisxJob] для зависимости: ожидается как минимум 1 bean-компонент, который считается кандидатом autowire для этой зависимости. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = true), @ org.springframework.beans.factory.annotation.Qualifier (value = CisxJob)} в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues ​​(AutowiredAnnotationBeanPostProcessor.java:286) .............

Проблема в расширении QuartzJobBean - но мне это нужно.

Спасибо

1 Ответ

6 голосов
/ 19 апреля 2011

Проблема в том, что Spring генерирует прокси AOP. Когда проксируемый класс реализует какие-либо интерфейсы, Spring по умолчанию создает JDK-прокси, который реализует эти интерфейсы.

Поскольку QuartzJobBean реализует интерфейс Job, CisxJob проксируется как Job, и этот прокси не может быть автоматически подключен к полю типа CisxJob.

Есть два решения:

  • Если ваш компонент реализует какие-либо интерфейсы, создайте интерфейс и для его бизнес-методов и используйте его в качестве типа поля:

     public interface CisxJob { ... }
    
     @Component("CisxJob")
     public class CisxJobImpl extends HuginJob implements CisxJob {...} 
    
  • Использовать режим класса прокси-цели:

     <aop:aspectj-autoproxy proxy-target-class = "true" />
    

Смотри также:

...