Импортировать Spring-бины из других модулей Maven в WAR? - PullRequest
6 голосов
/ 23 сентября 2010

У меня есть новое веб-приложение, которое упаковано как WAR как часть многомодульного проекта Maven. ApplicationContext.xml для этой WAR ссылается на bean-компоненты, импортированные из модуля «service», который, в свою очередь, импортирует bean-компоненты из модуля «dao». Оператор импорта в applicationContext.xml выглядит следующим образом:

<import resource="classpath*:service.xml" />

и тот, что внутри файла service.xml, выглядит следующим образом:

<import resource="classpath*:dao.xml" />

Ни Spring STS, ни Eclipse не показывают никаких предупреждений или ошибок в моих файлах компонентов. Я упоминаю импортированные бобы повсюду. Сборка Maven работает нормально, и все тесты интеграции DAO проходят (они используют компоненты). У меня пока нет тестов интеграции сервисов.

Но когда я запускаю WAR в Jetty, я получаю сообщение об ошибке:

Error creating bean with name 'securityService' 
Cannot resolve reference to bean 'userDAO' while setting constructor argument

Все импортированные XML-файлы bean-компонентов можно найти в соответствующих им JAR-файлах в каталоге WEB-INF / lib. Действительно, компонент службы, выдавший ошибку, сам по себе определен в файле service.xml внутри файла JAR модуля службы.

Очевидно, что служебный модуль не может найти компонент, импортированный из модуля dao. Очевидно, я чего-то не понимаю ... кажется, что это должно быть просто работать?

Ответы [ 4 ]

6 голосов
/ 24 сентября 2010

Я включил ведение журнала DEBUG для 'org.springframework', чтобы посмотреть, смогу ли я чему-нибудь научиться. Я обнаружил сообщения о том, что компоненты DAO были созданы, но также было сообщение о том, что у них нет имени или идентификатора.

Я проверяю файл, и у них у всех был идентификатор. Так что это было? Я проверил пространство имен XML и увидел:

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"

и заметил, что он старый (я использую Spring 3.0.2) и изменил его на:

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

Как только я изменил его, Spring мгновенно выдал полдюжины ошибок, связанных с bean-компонентами, которые были определены неправильно (но, очевидно, никогда не использовались). Как только я исправил эти ошибки, все просто сработало. С тех пор я прошел через всю систему, проверяя версии пространства имен файлов Spring XML.

Спасибо всем за помощь. Не могу поверить, что я потратил впустую день на эту глупость !!

2 голосов
/ 24 сентября 2010

Разница между нотациями classpath:thingy.xml и classpath*:thingy.xml заключается в том, что первая использует стандартный механизм пути к классам для разрешения одного ресурса (используя ClassLoader.getResource (name) ), тогда как последняя будет использовать ClassLoader.getResources (name) для извлечения всех подходящих ресурсов на пути к классам, и это различие не должно иметь значения в вашей ситуации, так как, я полагаю, в пути к классам есть только один файл dao.xml.

Я думаю, что ваша проблема в другом, вам не хватает косой черты.

Используйте это для одного ресурса

<import resource="classpath:/dao.xml" />

и для нескольких ресурсов

<import resource="classpath*:/dao.xml" />

См.

1 голос
/ 23 сентября 2010

должно быть как

<import resource="classpath:service.xml"/>
0 голосов
/ 24 сентября 2010

У вас есть несколько applicationContexts, и, возможно, родительский контекст ссылается на bean-компонент, определенный в дочернем контексте?

...