2013-10-15 5 views
1

В моем приложении я использую общий шаблон DAO. Моя классовая структура выглядит следующим образом:Проблема с Autowiring + genericDAO pattern весной

  1. Класс домен - 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; 
        } 
         ........ 
    } 
    
  2. интерфейс DAO, который соответствует NamedQueries в класс выше домена

    package com.test.abc.h; 
    public interface INameDao extends IGenericDAO<...., ....> { 
    ....method signature...... 
    } 
    
  3. IGenericDAO интерфейс

    package com.test.abc.h; 
    public interface IGenericDAO<T, PK extends Serializable> { 
         ......... 
    } 
    
  4. 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 ........ 
    } 
    
  5. Применение:

    <context:component-scan base-package="com.test.abc" /> 
    <context:annotation-config /> 
    <mvc:annotation-driven /> 
    <mvc:default-servlet-handler /> 
    
  6. Класс обслуживания имеет следующие заявления 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 классу домена имени, что тоже не помогло.

ответ

0

Похоже, что ваш GenericDAO имеет тип IGenericDAO, но вы ошиблись, предположите, что вы вводите фасоль типа INameDAO. В то время как INameDAO имеет тип IGenericDAO, ваш GenericDAO не относится к типу INameDAO. Вам нужно либо исправить дерево наследования вашего GenericDAO, либо изменить тип компонента, который нужно ввести, чтобы включить что-то в его дерево.

РЕДАКТИРОВАТЬ

Для того, чтобы привести пример. Это похоже на определение java.util.Collection, java.util.List и java.util.Set. Затем вы объявляете bean-компонент, обладающий свойством List, и пытаетесь ввести Set. Хотя у них есть общий предок, они несовместимы. Вы можете изменить свой компонент, чтобы принять свойство Collection, но вы будете ограничены методами Collection.

С структурой, приведенной ниже, вы вводите MyActualDAOImpl в собственность типа MyActualDAO (я отказался от дженериков). Поместите свой NamedQueries on your Entity`.

Общественные интерфейсы:

public interface GenericDAO{ 
    //crud methods 
} 

public interface MyActualDao inherits GenericDAO{ 
    //other non-crud methods, if needed 
} 

Реализация

public abstract class AbstractDAO implements GenericDAO{ 
    //generic implementations of CRUD 
} 


public MyActualDAOImpl inherits AbstractDAO implements MyActualDAO{ 
    ... 
} 
+0

Причина, по которой я являюсь autowiring INameDAO, должен иметь возможность вызвать именованный запрос, присутствующий в классе домена имени. Отредактировал мой вопрос, чтобы включить эту информацию. – user811433

+0

Затем вам нужно реорганизовать свой код, поскольку Spring попытается ввести по типу, а ваш GenericDAO не имеет типа INameDAO. С вашим текущим определением вы можете сделать свой целевой компонент общим типом IGenericDAO, но я ожидаю, что вы потеряете видимость других методов в GenericDAO. В любом случае ваша текущая структура не будет работать. – Romski

+0

Любые предложения по конкретным изменениям, которые мне нужно внести, чтобы исправить это? – user811433

1

ваш INameDao является интерфейс и INameDao не реализует какой-либо класс в качестве кода[email protected] - это использование для инъекций зависимостей, а @Autowires не найдено ни одного класса INameDao. Поэтому вам нужно сначала создать класс Impl для INameDao. Исключением является исключение NoSuchBeanDefinitionException, поэтому весной не найден какой-либо квалификационный компонент типа [com.test.abc.h.INameDAO].