Использование component-scan в веб-проекте


У меня есть Eclipse "динамический веб-проект" и сервер Tomcat, настроенный в Eclipse для использования этого проекта. У меня есть расширение файла, сопоставленное сервлету, и в конфигурации сервлета у меня есть установка элемента component-scan следующим образом:

<context:component-scan base-package="com.mycompany.web" />

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

May 6, 2011 9:50:23 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet cap
java.lang.IllegalArgumentException: Resource path [C:...srcmainwebappWEB-INFclassescommycompanyweb] does not denote a directory

Этот каталог не существует (за исключением упакованного .War-файл). Однако ком.название_компании.веб-пакет существует.

Есть ли другой способ сделать компонент-сканирование? Его нужно либо искать в другой папке, либо каким-то образом найти в моем проекте или еще где-то...

2 2

2 ответа:

Не представляется возможным выполнить сканирование компонентов таким образом. Он делает список каталогов, что, я думаю, невозможно, когда файлы класса физически не расположены там, где ожидает Spring. Я решил эту проблему, просто не используя component-scan и перечисляя контроллеры в конфигурации spring следующим образом:

<context:annotation-config />
<bean class="com.mycompany.web.MyController"/>

Аннотации в контроллере все еще работают, поэтому перечисление контроллеров вручную является единственным дополнительным шагом.

Можно делать то, что вы хотите, но вам нужна небольшая дополнительная конфигурация.

Вы можете аннотировать свои классы с помощью @Controller или @Repository или других аннотаций Spring stereotype, и Spring автоматически подберет их.

Или вы можете дать context:component-scan немного больше информации. Пример:

<context:component-scan base-package="com.mycompany.web">
    <!-- scan all classes in the com.mycompany.web package (but
         not in subpackages) -->
    <context:include-filter type="aspectj" expression="com.mycompany.web.*"/>


    <!-- or if you want to include subpackages this config scans all
         classes in com.mycompany.web.special and in its subpackages
         (that's what the ..* means) -->
    <context:include-filter type="aspectj" expression="com.mycompany.web.special..*"/>
</context:component-scan>
Наконец, если вам не нравится использовать aspectj, context: include-filter type может быть регулярным выражением, пользовательской аннотацией и т. д. Смотрите эту ссылку для получения дополнительной информации.