В моем приложении я использую общий шаблон DAO. Моя классовая структура выглядит следующим образом:Проблема с Autowiring + genericDAO pattern весной
Класс домен - 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; } ........ }
интерфейс DAO, который соответствует NamedQueries в класс выше домена
package com.test.abc.h; public interface INameDao extends IGenericDAO<...., ....> { ....method signature...... }
IGenericDAO интерфейс
package com.test.abc.h; public interface IGenericDAO<T, PK extends Serializable> { ......... }
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 ........ }
Применение:
<context:component-scan base-package="com.test.abc" /> <context:annotation-config /> <mvc:annotation-driven /> <mvc:default-servlet-handler />
Класс обслуживания имеет следующие заявления autowire:
@Autowired private Name name; @Autowired private INameDAO nameDAO; ...... nameDAO.callToNamedQuery() - here I would like to call the named query present in Name class.
Я вижу ошибку ниже когда Я стараюсь arup сервер:
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 - и к домену имен. Это не помогло. Также добавлена аннотация @Component классу домена имени, что тоже не помогло.
Причина, по которой я являюсь autowiring INameDAO, должен иметь возможность вызвать именованный запрос, присутствующий в классе домена имени. Отредактировал мой вопрос, чтобы включить эту информацию. – user811433
Затем вам нужно реорганизовать свой код, поскольку Spring попытается ввести по типу, а ваш GenericDAO не имеет типа INameDAO. С вашим текущим определением вы можете сделать свой целевой компонент общим типом IGenericDAO, но я ожидаю, что вы потеряете видимость других методов в GenericDAO. В любом случае ваша текущая структура не будет работать. – Romski
Любые предложения по конкретным изменениям, которые мне нужно внести, чтобы исправить это? – user811433