Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Проблема с @Autowired


Автор: MakTpaxep 24.12.2012, 19:52
Сделал всё как у этого дядьки http://www.sivalabs.in/2011/04/springmvc3-hibernate-crud-sample.html
Ошибка
Код

SEVERE: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start:
 org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException:
 Error creating bean with name 'contactsController': Injection of autowired dependencies failed;
 nested exception is org.springframework.beans.factory.BeanCreationException:
 Could not autowire field: private mypack.dao.ContactsDAO mypack.controller.ContactsController.contactsDAO;
 nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
 No matching bean of type [mypack.dao.ContactsDAO] 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)}

Направьте меня)

Автор: Nofate 24.12.2012, 20:33
Разберем ваш лог. Вчитываемся:

Код

Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start:

Было брошено исключение при инициализации приложения. Ок. Читаем далее.
Код

org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException:
 Error creating bean with name 'contactsController': Injection of autowired dependencies failed;

Исключение брошено из-за ошибки создания бина (экземпляра класса) с именем contactsController. Не удалось выполнить  внедрение зависимости, отмеченной аннотацией @Autowired. Какой именно зависимости?
Код

Could not autowire field: private mypack.dao.ContactsDAO mypack.controller.ContactsController.contactsDAO;

Речь о поле contactsDAO типа ContactsDAO.
Почему не удалось?
Код

 nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
 No matching bean of type [mypack.dao.ContactsDAO] found for dependency:
 expected at least 1 bean which qualifies as autowire candidate for this dependency.


Spring не смог найти ни одного класса реализующего интерфейс ContactsDAO.

Почему так могло случиться? Вы могли:
  • забыть указать аннотацию @Repository перед классом ContactsDAO.
  • забыть указать пакет для поиска в applicationContext.xml.
    Код

      <context:component-scan base-package="mypack.dao"></context:component-scan>

Автор: MakTpaxep 24.12.2012, 21:24
Спасибо! Помогло.
А не подскажете почему в этом проекте не создаётся сначала интерфейс DAO, а потом уже класс реализующий интерфейс?
Во многих проектах так сделано, я не понимаю зачем. Тут и без дополнительных движений всё работает.
PS хотя у меня пока что не всё работает, но думаю донастрою,

Автор: Nofate 24.12.2012, 22:07
Цитата(MakTpaxep @  24.12.2012,  21:24 Найти цитируемый пост)
Во многих проектах так сделано, я не понимаю зачем.

Разделение интерфейса от реализации очень полезно. Повышает модульность, упрощает тестирование, позволяет менять реализацию на лету. Скажем у нас могло бы быть несколько реализаций DAO.

В выше упомянутом примере автор, видимо желал упростить материал для понимания, поэтому не стал заморачиваться интерфейсами.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)