Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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:

Код

<context-param>
     <param-name>contextConfigLocation</param-name>
         <param-value>
             /WEB-INF/applicationContext.xml
         </param-value>
</context-param>


Но указать в качестве параметра путь к 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: [email protected]
    ICQ#: 256052128
    Jabber: [email protected] 

Автор: yray 27.9.2006, 08:58
Большое спасибо за советы, сейчас буду пробовать реализовать один из подходов

Автор: _and 2.10.2006, 11:19
yray, поделись решением своим а то интересно всё-таки как енто реализовать мона(вдруг еще кому придется такое же делать)

Автор: onsh76 3.10.2006, 08:57
Цитата(yray @ 26.9.2006,  15:42)
... То есть в первом случае мы имеем один файл конфигурации AcegiSecurity, а во втором случае конфигурация Acegi будет совершенно иной. Мне бы хотелось, чтобы при запуске стартовой страницы веб-приложения происходила проверка связи с сервером CAS и если связь есть, то приложение перенаправляется на сервер CAS и там пользователь проходит процесс идентификации\авторизации с помощью cas-настроек acegisecurity, если связи нет, то процесс логина происходит с помощью веб-форм настроек acegisecurity. Вся проблема и сводится к тому, чтобы динамически менять applicattion context spring в зависимости от условия.

А может проще будет дать уникальные имена бинам в двух спринговских конфиг.файлах (например, задав определенные префиксы), загрузить оба файла по обычной методике, прописав их в 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?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)