2013-12-11 64 views
3

我剛剛從春天3.2更新到春天4.0.0.RC2但運行測試時我現在得到以下厚望升級到春天4.0

org.springframework.beans.factory.NoSuchBeanDefinitionException 
我DAO類

(NoSuchBeanDefinitionException)。自動裝配PersistenceContext(這是我們自己的泛型類)時失敗。

@Repository 
public class AccountDaoImpl extends AbstractDao<Account> implements AccountDao { 

    @Autowired 
    public AccountDaoImpl(final PersistenceContext<Account> context) { 
     super(context); 
    } 

... 

如果我將版本更改回3.2一切正常。 4.0中導致這個問題的不同之處是什麼?

+1

請發佈完整的堆棧跟蹤和PersistenceContext的bean定義。 –

回答

1

發生這種情況的原因很可能是因爲您注入的bean聲明瞭不同的(比Account)類型的參數。 Spring Framework 4現在執行更嚴格的類型檢查。

這裏是示出該問題的示例(測試通過具有SF 3.2.3.RELEASE和失敗4.0.0.RC2):

@ContextConfiguration(classes=GenericAutowireTest.TestConfig.class) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class GenericAutowireTest { 

    public static class MyGenericClass<T> { 
    } 

    @Configuration 
    public static class TestConfig { 

     @Bean 
     public MyGenericClass<String> myGenericClass() { 
      return new MyGenericClass<String>(); 
     } 
    } 

    @Autowired 
    private MyGenericClass<Integer> myObject; 

    @Test 
    public void test() { 
     assertNotNull(myObject); 
    } 

} 

這裏的a nice article關於這一新功能。

解決方法是讓「接受」@Autowired字段類型可分配給@Bean返回類型,例如,使它們相同,包括參數化類型。只有在運行時纔有意義。

+0

實質上,我們通過逐步完成彈簧代碼來實現它。它在獲得泛型類型的@Service bean時感到困惑。我很確定這是一種類似於你所說的錯誤,並且通過將泛型從類中移出到另一類來解決。 – jax

+0

@Smollet - 那麼如果我想保留泛型,解決方案是什麼?使用@Qualifier(「beanname」)? –

+0

@AndyDufresne解決方案是在依賴注入的兩側創建相同的類型:'@ Bean'返回類型和「接受」'@ Autowired'字段類型(這在運行時纔有意義)。順便說一句。當你使用'@ Qualifier'註解時,往往會使用一些通用的概念來命名關係,而不是一個bean名稱(這也很好)。 –