1

Я пытаюсь ввести dao-bean в свой контроллер из Spring MVC. Я использую общий шаблон dao для dao-объектов.Весна не может установить dao bean в контроллере

По неизвестной причине, я получаю эту ошибку:

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)} 

Это общий дао интерфейс:

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) ; 
} 

Общий класс дао:

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 I Попробуйте ввести:

package service; 
import domain.Klant; 

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

Класс контроллера, где я пытаюсь привнести боб:

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

// route methods 

    public KlantDao getKlantDao() { 
     return klantDao; 
    } 

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

В диспетчерском сервлета настроить боб так:

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

Я думаю, что проблема-то с автоувеличивание. Я пробовал множество комбинаций настроек, но всегда получаю ту же ошибку.

Я надеюсь, что кто-то может помочь. Благодаря

+1

Там нет рожкового типа 'KlantDao' в контексте, это связано с прокси-серверов, которые бьёт АОП механизм. Существует бит типа «GenericDao », а не «KlantDao». Я настоятельно рекомендую использовать [Spring Data JPA] (http://projects.spring.io/spring-data-jpa/) таким образом, что вы можете удалить код «GenericDao» и сэкономить много шаблонов. –

+1

Отсутствует информация по вашему вопросу; например, механизм проводки через аннотации или просто конфигурацию XML? Версия весны? Я считаю, что это должно быть исправлено с помощью 'proxy-target-class = true'. (Пример: http://stackoverflow.com/a/9120104/248082) – nobeh

ответ

0

Ваш код правильный, но вам нужно добавить @Services KlantDao

+0

Где я должен добавить @Services? Я не понимаю вашего ответа. – wardva

Смежные вопросы