2016-02-25 3 views
1

Я пытаюсь повторно использовать классы и код DAO, основанные на Spring-JDBC, в проекте, который имеет традиционный сервлет (контроллер Spring) диспетчера Spring). Как показано ниже, я попытался запустить application-config.xml вручную, используя ClassPathXmlApplicationContext. Однако, я получаю ошибку, показанную ниже.Создание экземпляров Spring beans

private static final String CONFIG_PATH = "classpath*:application-config.xml"; 

private signupDao SignupDao; 


ApplicationContext context = new ClassPathXmlApplicationContext(CONFIG_PATH); 

signupDao = context.getBean(SignupDao.class); 

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.abc.dao.SignupDao] is defined at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:371) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)

Раньше я не добавить следующую запись в приложение-config.xml, но даже после добавления, я все еще получаю ту же ошибку, что и выше («Нет квалификационная рожкового типа не определен») ,

<bean id="signupDao" class="com.abc.dao.SignupDao"></bean> 

Любые идеи?

Сервлет контроллер не мой собственный, я получаю его от третьей стороны, я только пытаюсь расширить свои обработчики, где я пытаюсь использовать Spring, JDBC автоматического связывания и т.д.

EDIT:

Единственный боб, который я могу загрузить, - context.getBean(MessageSource.class), ни один из моих компонентов не может быть загружен. getBeanDefinitionNames возвращает пустой массив, когда я пытался раньше. Считаете ли вы, что это проблема класса?

+0

Попробуйте удалить '*' 'от вашего CONFIG_PATH' –

+0

Я получаю эту ошибку, если я делаю это:' Вызванный: java.io.FileNotFoundException: путь к классам ресурсов [приложение-config.xml] не может быть открыт потому что он не существует' –

ответ

2
  1. Удалите classpath*: часть из CONFIG_PATH потому ClassPathXmlApplicationContext уже смотрит в путь класса для файла (смотрите на это имя);

  2. Убедитесь, что ваш файл application-config.xml находится в корневом каталоге вашего WEB-INF/classes веб-приложения, в противном случае он не будет находиться в пути к классам (это предполагает, что файл не упакован в другом банке).

+0

Спасибо большое, это сработало, я использовал пример из другого проекта для 'classpath *: application-config.xml', не думал, что это будет быть проблемой. Я пропустил начальную ошибку и теперь застрял в: 'org.springframework.beans.factory.BeanCreationException: ошибка при создании bean с именем 'org.springframework.validation.beanvalidation.MethodValidationPostProcessor # 0', определенном в ресурсе пути к ключу [application-config. xml]: вызов метода init не выполнен; Вложенное исключение - это java.lang.NoClassDefFoundError: Не удалось инициализировать класс org.hibernate.validator.internal.engine.ConfigurationImpl' –

+0

Возможно, проблема с отсутствующим банком для этого компонента:

+0

Привет, вы знаете, есть ли способ избежать вызова нового класса ClassPathXmlApplicationContext (" application-config.xml ")' в каждом из моих обработчиков, и я не знаю, какие обработчики будут вызваны в первый раз. Есть ли накладные расходы на загрузку 'application-config.xml' в нескольких местах вашего приложения? Спасибо за любые идеи. –

2

Чтобы сузить проблему, убедитесь, что созданный ApplicationContext успешно создан.

Это должно вернуть все имена бобов из заданного контекста приложения.

context.getBeanDefinitionNames(); 

Update

Если ApplicationContext не перечислить любые бобы из вашего XML-конфигурации, это может быть признаком того, что файл ресурс не доступен по ClassPathXmlApplicationContext.

Один из способов проверить это сделать что-то вроде этого:

ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream("application-config.xml") 

Это должно вернуть действительный не нулевой поток в случае ресурс доступен.

Примечание формат имени ресурса. Она не должна включать в себя любые префиксы, как classpath: или classpath*:

+0

Единственный bean-компонент, который я могу загрузить, это 'context.getBean (MessageSource.class)', ни один из моих beans-файлов не может быть загружен.getBeanDefinitionNames возвращает пустой массив, когда я пытался раньше. Считаете ли вы, что это проблема класса? –

+0

Это означает, что никакие бобы не были прочитаны из ресурса pathpath (скорее всего, ресурс не может быть расположен с указанным именем). Убедитесь, что ресурс доступен для класса ClassPathXmlApplicationContext. – WeMakeSoftware

+0

Если я изменяю 'classpath *: application-config.xml' только на' application-config.xml', я получаю сообщение об ошибке, неспособное найти application-config.xml, поэтому я думаю, что он может правильно найти приложение-config.xml ... –

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

  • Нет связанных вопросов^_^