【问题标题】:Spring can not set dao bean in controllerSpring无法在控制器中设置dao bean
【发布时间】:2013-12-24 19:55:21
【问题描述】:

我正在尝试从 Spring MVC 向我的控制器中注入一个 dao-bean。我正在为 dao 对象使用通用 dao 模式。

由于未知原因,我收到此错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'klantController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private service.KlantDao controllers.KlantController.klantDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [service.KlantDao] 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)}

这是通用的 dao 接口:

package service;

import java.util.List;

public interface GenericDao<T> {

    public List<T> findAll();
    public T update(T object);
    public T get(Long id);
    public void delete(T object);
    public void insert(T object);
    public boolean exists(Long id) ;
}

通用 dao 类:

package service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Transactional;

@Transactional
public class GenericDaoJpa<T> implements GenericDao<T> {

    private Class<T> type;
    private EntityManager em;

    public GenericDaoJpa(Class<T> type) {
        super();
        this.type = type;
    }

    @PersistenceContext
    public void setEntityManager(EntityManager em) {
        this.em = em;
    }

    @Transactional(readOnly = true)
    @Override
    public T get(Long id) {
        T entity = this.em.find(this.type, id);
        return entity;
    }

    @Transactional(readOnly = true)
    @Override
    public List<T> findAll() {
        return this.em.createQuery(
                "select entity from " + this.type.getName() + " entity").getResultList();
    }

    //@Transactional
    @Override
    public void insert(T object) {
        em.persist(object);
    }

    //@Transactional
    @Override
    public void delete(T object) {
        em.remove(em.merge(object));
    }

    @Transactional(readOnly = true)
    @Override
    public boolean exists(Long id) {
        T entity = this.em.find(this.type, id);
        return entity != null;
    }

    @Override
    public T update(T object) {
        return em.merge(object);
    }
}

我尝试注入的具体 DAO:

package service;
import domain.Klant;

public class KlantDao extends GenericDaoJpa<Klant>
{
    public KlantDao()
    {
        super(Klant.class);
    }
}

我试图注入 bean 的控制器类:

@Controller
public class KlantController 
{
    @Autowired
    private KlantDao klantDao;

// route methods

    public KlantDao getKlantDao() {
        return klantDao;
    }

    public void setKlantDao(KlantDao klantDao) {
        this.klantDao = klantDao;
    }
}

在调度程序 servlet 中,我像这样配置 bean:

<bean id="klantDao" class="service.KlantDao"/>

我认为问题出在自动装配上。我尝试了很多设置组合,但总是收到相同的错误。

我希望有人可以提供帮助。 谢谢

【问题讨论】:

  • 上下文中没有KlantDao 类型的bean,这是由于代理,它是springs aop 机制。有一个 GenericDao&lt;Klant&gt; 类型的 bean,而不是 KlantDao。我强烈建议使用Spring Data JPA 这样您就可以删除GenericDao 的代码并为您节省大量样板文件。
  • 您的问题缺少信息;例如通过注释的布线机制或仅仅是 XML 配置?春天的版本?我相信这应该用proxy-target-class=true 解决。 (例如:stackoverflow.com/a/9120104/248082

标签: spring hibernate dependency-injection hibernate-generic-dao


【解决方案1】:

您的代码是正确的,但您需要添加@Services KlantDao

【讨论】:

  • 我必须在哪里添加@Services?我不明白你的回答。
猜你喜欢
  • 2012-06-01
  • 2017-07-26
  • 2014-10-16
  • 2013-04-20
  • 2017-02-22
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多