0

spring MVC からコントローラに dao-bean を注入しようとしています。dao-objects には一般的な 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;
    }
}

ディスパッチャ サーブレットでは、次のように Bean を構成します。

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

問題は自動配線にあると思います。多くの設定の組み合わせを試しましたが、常に同じエラーが発生します。

誰かが助けてくれることを願っています。ありがとう

4

1 に答える 1

0

あなたのコードは正しいですが、@Services KlantDao を追加する必要があります

于 2013-12-07T12:58:35.177 に答える