Использование 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 ответа:
Не представляется возможным выполнить сканирование компонентов таким образом. Он делает список каталогов, что, я думаю, невозможно, когда файлы класса физически не расположены там, где ожидает Spring. Я решил эту проблему, просто не используя component-scan и перечисляя контроллеры в конфигурации spring следующим образом:
<context:annotation-config /> <bean class="com.mycompany.web.MyController"/>
Аннотации в контроллере все еще работают, поэтому перечисление контроллеров вручную является единственным дополнительным шагом.
Можно делать то, что вы хотите, но вам нужна небольшая дополнительная конфигурация.
Вы можете аннотировать свои классы с помощью @Controller или @Repository или других аннотаций Spring stereotype, и Spring автоматически подберет их.
Или вы можете дать
context:component-scan
немного больше информации. Пример:Наконец, если вам не нравится использовать aspectj, context: include-filter<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>
type
может быть регулярным выражением, пользовательской аннотацией и т. д. Смотрите эту ссылку для получения дополнительной информации.