Как использовать Spring DI с двумя или более сервлетами? - PullRequest
0 голосов
/ 14 марта 2012

Пожалуйста, прости, если я неправильно использую терминологию, но я новичок в java-веб-разработке и Spring. Исправьте мои предположения, если я ошибаюсь.

Я хочу создать веб-приложение, которое использует Vaadin для пользовательского интерфейса и Spring MVC для веб-служб RESTful. Итак, я думаю, мне нужно 2 сервлета. Один для служения Ваадину и один для служения Spring MVC.

У меня есть несколько общих дао-бинов, которые используются обоими сервлетами, поэтому я подумал, что мог бы использовать Spring с аннотацией @Autowired для добавления этих бобов с тегами @Repository и @Component в MVC и Vaadin- "(App | Servlet)". (Обнаружен через пружины компонент-сканирование - функция)

Но я не могу заставить его работать. Spring-MVC-App - работает. Я аннотировал все @Controllers, и все автоматически @Autowired.

Но в Ваадине я всегда получаю:

SCHWERWIEGEND: Servlet.service() for servlet [hello] in context with path [/pliste] threw exception [javax.servlet.ServletException: failed to acquire new instance of class net.d21.pliste.HelloWorld] with root cause
org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [net.d21.pliste.HelloWorld] is defined: expected single bean but found 0: 

Я думаю, что мой основной вопрос - как внедрить общие зависимости в 2 разных сервлета? (В моем случае это Vaadin и MVC, но я думаю, что это можно заменить).

1 Ответ

1 голос
/ 14 марта 2012

Типичное веб-приложение Spring имеет двухуровневую иерархию контекстов приложения:

  • Контекст корневого приложения загружен ContextLoaderListener, его файл конфигурации по умолчанию - applicationContext.xml. Этот контекст содержит общие компоненты, которые могут использоваться всеми сервлетами, фильтрами и т. Д.

  • Специфичные для сервлета контексты приложения. Их настройки по умолчанию ${serlvet-name}-servlet.xml. Эти контексты содержат компоненты, специфичные для конкретных сервлетов.

Итак, в вашем случае вам нужно объявить общие bean-компоненты в applicationContext.xml и специфичные для сервлета bean-компоненты (например, контроллеры для Spring MVC) в специфичных для сервлета контекстах.

Обратите внимание, что если вы используете <component-scan>, вам нужно избегать дублирования bean-компонентов в разных контекстах, либо используя разные базовые пакеты, либо фильтруя их по аннотациям .

...