Я пытаюсь ввести 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"/>
Я думаю, что проблема-то с автоувеличивание. Я пробовал множество комбинаций настроек, но всегда получаю ту же ошибку.
Я надеюсь, что кто-то может помочь. Благодаря
Там нет рожкового типа 'KlantDao' в контексте, это связано с прокси-серверов, которые бьёт АОП механизм. Существует бит типа «GenericDao», а не «KlantDao». Я настоятельно рекомендую использовать [Spring Data JPA] (http://projects.spring.io/spring-data-jpa/) таким образом, что вы можете удалить код «GenericDao» и сэкономить много шаблонов. –
Отсутствует информация по вашему вопросу; например, механизм проводки через аннотации или просто конфигурацию XML? Версия весны? Я считаю, что это должно быть исправлено с помощью 'proxy-target-class = true'. (Пример: http://stackoverflow.com/a/9120104/248082) – nobeh