2013-03-26 17 views
1

我有一個具有「ticketDao」的相關性的測試案例,像下面下運行測試用例時不工作框架的AbstractJpaTests,春天是V3.0.5@Qualifier和@Resource Spring測試框架

當運行這個測試時,我得到了一個類似的例外:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No unique bean of type [com.mpos.lottery.te.gamespec.sale.dao.BaseTicketDao] 
is defined: expected single matching bean but found 2: 
[baseTicketDao, extraballTicketDao] 

我遇到的時候,我的項目已經發展了很長時間,其實這是第一次例外,@Qualifier解決了它。直到今天這個項目已經發生了很大的變化,但我真的不知道爲什麼@Qaulifier和@Resource不再工作。

如果我刪除'ticketDao'的依賴項,測試用例會通過。我想知道是否有一些彈簧配置的變化導致這個異常?或...我GOOGLE了很多,但似乎沒有其他人曾經遇到這樣的問題,請給出您的意見,非常感謝!

回答

1

您正在使用AbstractJPATests,它是舊的彈簧測試框架和AbstractDependencyInjectionSpringContextTests(間接)子類的一部分。默認情況下,注入不是基於註釋的,但它發現設置器和字段並嘗試按類型注入。建議切換到更新的基於註釋的測試,詳情請參閱spring文檔。

解決方法嘗試更改自動裝配模式。在測試構造函數中調用它爲this.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_BY_NAME),將您的字段重命名爲baseTicketDao並刪除setter。

+0

謝謝。我知道,默認情況下,測試將按類型自動連接,而在我的理解中,如果顯式聲明state \ @Qualifier,則Spring框架將按名稱連線。最重要的是@Qualifier之前的工作,是什麼讓它現在停止工作。 – Ramon 2013-03-27 06:37:07

+0

據我所知,在這種情況下,註釋將被忽略。我不知道爲什麼@Qualifier之前工作過(我真的懷疑它做過)。 – mrembisz 2013-03-27 08:46:18

0

我知道原因。在我的新項目中,有上下文的語句:組件掃描在Spring配置文件,它會默認註冊4個BeanPostProcessor的:

  • AutowiredAnnotationBeanPostProcessor(@Autowired)
  • RequiredAnnotationBeanPostProcessor(@Require)
  • CommonAnnotationBeanPostProcessor會(JSR-250註解,@Resource,@PostConstruct等@WebServiceRef)
  • PersistenceAnnotationBeanPostProcessor(@PersistenceUnit和@PersistenceContext)

在我的舊項目中,只有默認的BeanPostProcessor(internalAutoProxyCreator)已被註冊。我的理解是AutowiredAnnotationBeanPostProcessor將始終按類型進行連接。無論如何,如果刪除上下文:組件掃描,我的測試用例現在可以通過。

事實上,我已經將所有測試用例遷移到了Spring測試上下文框架中,並且context:組件掃描必須聲明,否則@Autowired,@Resource等註釋將被忽略,並且您將獲得很多那些自動注入的依賴關係的NullPointerException。

注意:<context:annotation-config/>也會註冊這4個BeanPostProcessors。