2013-10-15 31 views
1

在我的應用程序中,我使用的是泛型DAO模式。我的階級結構是這樣的:Autowiring + springDAO pattern在spring中的問題

  1. 域類 - POJO

    package com.test.abc.def; 
    @NamedQueries({------a couple of queries go here .......}) 
    @Entity 
    @Table(name = "NAME") 
    public class Name implements Serializable { 
        private String myName; 
        ........ 
        @Column(name = "MY_NAME", nullable = false, length = 30) 
        public String getMyName() { 
         return this.myName; 
        } 
        public void setName(String myName) { 
         this.myName= myName; 
        } 
         ........ 
    } 
    
  2. 對應於NamedQueries在上述領域的A類DAO接口

    package com.test.abc.h; 
    public interface INameDao extends IGenericDAO<...., ....> { 
    ....method signature...... 
    } 
    
  3. 一個IGenericDAO接口

    package com.test.abc.h; 
    public interface IGenericDAO<T, PK extends Serializable> { 
         ......... 
    } 
    
  4. GenericDAO實現類

    package com.test.abc.h.impl; 
    @Repository 
    @Scope(BeanDefinition.SCOPE_PROTOTYPE) 
    public class GenericDAO<T, PK extends Serializable> implements IGenericDAO<T, PK> { 
        ....method implemnetations ........ 
    } 
    
  5. 應用程序上下文:

    <context:component-scan base-package="com.test.abc" /> 
    <context:annotation-config /> 
    <mvc:annotation-driven /> 
    <mvc:default-servlet-handler /> 
    
  6. 服務類具有以下自動裝配聲明:

    @Autowired 
    private Name name; 
    @Autowired 
    private INameDAO nameDAO; 
    ...... 
    nameDAO.callToNamedQuery() - here I would like to call the named query present in Name class. 
    

我看到下面的錯誤時,我嘗試st artup服務器:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
qualifying bean of type [com.test.abc.h.INameDAO] found for dependency: expected at 
least 1 bean which qualifies as autowire candidate for this dependency. Dependency 
annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

我在這裏錯過了什麼? 我試着將@Repository註釋添加到INameDAO中 - 並且也添加了Name域類。這沒有幫助。 還向名稱域類添加@Component註釋 - 這也沒有幫助。

回答

0

看起來你的GenericDAO的類型是IGenericDAO,但是你錯誤地建議你注入一個類型爲INameDAO的bean。 INameDAO的類型爲IGenericDAO,而GenericDAO的類型不是INameDAO。您需要修復GenericDAO的繼承樹,或者通過更改要注入的bean的類型以在其樹中包含某些內容。

EDIT

爲了提供一個例子。這與定義java.util.Collection,java.util.List和java.util.Set類似。然後,您聲明一個具有List屬性的bean,並嘗試注入一個Set。雖然他們有一個共同的祖先,但它們是不相容的。你可以改變你的bean來接受一個Collection屬性,但是你將被限制在Collection的方法中。

通過下面的結構,您可以將MyActualDAOImpl注入MyActualDAO類型的屬性中(我已經放棄了泛型)。把你的NamedQueries on your實體。

公共接口:

public interface GenericDAO{ 
    //crud methods 
} 

public interface MyActualDao inherits GenericDAO{ 
    //other non-crud methods, if needed 
} 

實施

public abstract class AbstractDAO implements GenericDAO{ 
    //generic implementations of CRUD 
} 


public MyActualDAOImpl inherits AbstractDAO implements MyActualDAO{ 
    ... 
} 
+0

我自動裝配INameDAO的原因是能夠調用名稱域類中存在的命名查詢。編輯我的問題以包含此信息。 – user811433

+0

然後,您需要重構代碼,因爲Spring將嘗試按類型注入,並且您的GenericDAO不是類型INameDAO。使用您當前的定義,您可以使您的目標bean成爲常見類型IGenericDAO,但我希望您會失去GenericDAO中其他方法的可見性。無論哪種方式您目前的結構將無法正常工作。 – Romski

+0

關於我需要改正的具體變化的任何建議? – user811433

1

您INameDao是接口和INameDao沒有實現任何類作爲你的代碼。@Autowired 用於依賴注入和@Autowires沒有發現任何INameDao implements類。所以你需要先創建一個INameDao的Impl類。您的異常是NoSuchBeanDefinitionException,因此spring沒有找到任何類型爲[com.test.abc.h.INameDAO]的合格bean。