| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Spring: application context |
| Автор: yray 26.9.2006, 11:49 | ||
| Я недавно начал разбираться с j2ee, возникла проблема и пока не могу ее решить. Видел, что на форуме есть знатоки Spring, поэтому прошу помощи. Суть в следующем. Нужно при первом запуске страницы проверить определенное условие и в зависимости от результата проверки использовать различный набор бинов, определенных в xml файлах. Т.е. есть, например, файлы applicationContext _1.xml и applicationContext _2.xml. Когда пользователь в браузере обращается к стартовой странице, я должен проверить условие, если оно истинно, то веб-приложение использует applicationContext _1.xml, если ложно, то applicationContext _2.xml. Проблема в том, что я знаю только один способ определения application context для spring: с помощью web.xml:
Но указать в качестве параметра путь к applicationContext _1.xml и то applicationContext _2.xml одновременно нельзя, т.к. эти файлы взаимозаменяемы. А вот можно ли как-нибудь программно устанавливать путь к xml файлам с описанием бинов и где и как это можно сделать? |
| Автор: powerOn 26.9.2006, 13:41 |
| Модератор: Название темы должно отражать ее суть! |
| Автор: yray 26.9.2006, 15:16 |
| Прошу прощения, не придумал более внятное название темы. Наверное, тему можно было бы назвать "Application context в Sping framework" Я неоднократно в архиве видел, что здесь много участников форума имели дело со Spring'oм, поэтому очень надеюсь на помощь. Возможно, не совсем ясно раскрыл суть проблемы |
| Автор: batigoal 26.9.2006, 15:17 |
| Переименовал тему. |
| Автор: yray 26.9.2006, 15:42 |
| Спасибо, Lamer George. Сейчас название темы точно отражает суть вопроса. Хочу дать некоторые пояснения. Дело в том, что я использую библиотеку Asegi Security for Spring, спомощью которой хотелось бы организовать контроль доступа к веб-приложению. Предполагается использовать SSO (единую точку входа) на сайт с помощью http://www.ja-sig.org/products/cas/ если есть связь с сервером CAS или авторизацию с помощью веб-формы, если связи нет. То есть в первом случае мы имеем один файл конфигурации AcegiSecurity, а во втором случае конфигурация Acegi будет совершенно иной. Мне бы хотелось, чтобы при запуске стартовой страницы веб-приложения происходила проверка связи с сервером CAS и если связь есть, то приложение перенаправляется на сервер CAS и там пользователь проходит процесс идентификации\авторизации с помощью cas-настроек acegisecurity, если связи нет, то процесс логина происходит с помощью веб-форм настроек acegisecurity. Вся проблема и сводится к тому, чтобы динамически менять applicattion context spring в зависимости от условия. |
| Автор: tux 27.9.2006, 01:57 |
| Я вижу такой выход - не использовать средства Spring для конфигурирования веб-приложений, а загрузить конфигурацию вручную используя классы http://static.springframework.org/spring/docs/1.2.x/api/org/springframework/context/support/ClassPathXmlApplicationContext.html или http://static.springframework.org/spring/docs/1.2.x/api/org/springframework/context/support/FileSystemXmlApplicationContext.html. |
| Автор: _and 27.9.2006, 07:57 |
| yray, может можно попробовать сделать extends класса org.springframework.web.context.ContextLoaderListener и переопределить необходимые его методы или мона попробывать заимплементить интерфейс ServletContextListener который в свою очередь реализуется классом org.springframework.web.context.ContextLoaderListener. Затем в web.xml прописать свой листенер. Сам такого не пробовал так как мало работал со спрингом, так что если не прав то поправьте -- Feedback: E-mail: and_vs@ngs.ru ICQ#: 256052128 Jabber: andrew@jabber.zsmk.ru |
| Автор: yray 27.9.2006, 08:58 |
| Большое спасибо за советы, сейчас буду пробовать реализовать один из подходов |
| Автор: _and 2.10.2006, 11:19 |
| yray, поделись решением своим а то интересно всё-таки как енто реализовать мона(вдруг еще кому придется такое же делать) |
| Автор: onsh76 3.10.2006, 08:57 | ||
А может проще будет дать уникальные имена бинам в двух спринговских конфиг.файлах (например, задав определенные префиксы), загрузить оба файла по обычной методике, прописав их в web.xml. Далее написать свой бин, в котором делать обычную проверку проверку на связь с сервером CAS. Если она существует, то выдергивать КАСовский бин из первого контекста по префиксу и базовому имени. Если же связи нет, бросай exception, ну а в обработке exception-а берешь другой префик и подстыковываешь его к базовому имени. |
| Автор: yray 5.10.2006, 15:58 |
| Спасибо всем за помощь. Я изначально сделал так, как предлагал _and, то есть переопределил org.springframework.web.context.ContextLoaderListener и прописал его в web.xml, но этот способ не подходит, т.к. ContextLoaderListener, если я не ошибаюсь, как и присуще Listener'y срабатывает только один раз при запуске веб-сервера или деплое веб-приложения. Способ, предложенный onsh76 тоже можно реализовать. Пока занят несколько другими вещами, поэтому написать о том, как это реализовал пока не могу |
| Автор: vaz 8.7.2010, 17:27 |
| Столкнулся с такой проблемой при миграции со spring 1.2.7 в 3.0.2: ul 8, 2010 5:03:40 PM org.apache.catalina.core.StandardContext listenerStart SEVERE: Exception sending context initialized event to listener instance of class com.xxx.webapp.listener.UserCounterListener java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present - check whether you have multiple ContextLoader* definitions in your web.xml! У меня действительно используется два листенера в web.xml: <listener> <listener-class>com.xxx.webapp.listener.StartupListener</listener-class> </listener> <listener> <listener-class>com.xxx.webapp.listener.UserCounterListener</listener-class> </listener> оба наследуются от ContextLoaderListener, оба важны, объединить в один не могу по идеологическим причинам. Но томкэт, как видно из куска лога не пропускает два листенера. Интересно, что в 1.2.7 все пропускало нормально в том же окружении. Может кто знает, каким образом можно оставить два листенера наследуясь от ContextLoaderListener? |