1

在我的应用程序中,我使用的是通用 DAO 模式。我的班级结构如下所示:

  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. 与上述 Domain 类中的 NamedQueries 对应的 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.  
    

当我尝试启动服务器时,我看到以下错误:

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 域类。那没有帮助。还在 Name 域类中添加了 @Component 注释 - 这也没有帮助。

4

2 回答 2

1

您的 INameDao 是接口,并且 INameDao 没有实现任何类作为您的代码。@Autowired 用于依赖注入,@Autowires 未找到任何 INameDao 实现类。所以需要先创建一个INameDao的Impl类。您的例外是 NoSuchBeanDefinitionException,因此 spring 没有找到任何类型为 [com.test.abc.h.INameDAO] 的合格 bean。

于 2014-02-10T06:45:31.647 回答
0

看起来你GenericDAO的类型是类型IGenericDAO,但你的错误表明你正在注入一个类型的 bean INameDAO。虽然INameDAO是类型IGenericDAO,但你GenericDAO不是类型INameDAO。您需要修复您的继承树GenericDAO,或者通过更改要注入的 bean 的类型以在其树中包含某些内容。

编辑

举个例子。这类似于定义 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{
    ...
}
于 2013-10-15T00:32:09.050 回答