Использование Spring Security в приложении OSGi без SpringDM
Примерно полдня я пытаюсь найти способ перенести мои реализации в SpringSecurity в контекст комплектов OSGi (equinox) без переключения на SpringDM.
В настоящее время у нас есть два проекта:
1. У меня есть реализация Spring Security, основанная на некоторых XML-файлах конфигурации, для обработки аутентификации и авторизации.
2. С другой стороны, у нас есть огромная структура проекта OGSi с около 200 пакетами, которые необходимо интегрировать с пакетом безопасности (описанным выше)
В качестве первого шага для создания mySpringBasedSecurityBundle мне нужно запустить этот метод после загрузки mySecurityBundle, чтобы получить доступ к xml-файлу конфигурации безопасности: com / myComp / backend / appsecurity / spring / resources / Spring-Context.xml, который подготовил меня Spring-DataSource.xml и Spring-Security.xml следующим образом:
private void loadApplicationContext()
{
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_GLOBAL);
new ThreadLocal<Object>();
setApplicationContext(new ClassPathXmlApplicationContext(SPRING_CONTEXT_ADDRESS));
}
Но, к сожалению, это исключение произошло:
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [com/myComp/backend/appsecurity/spring/resources/Spring-Context.xml]; nested exception is java.io.FileNotFoundException: class path resource [com/myComp/backend/appsecurity/spring/resources/Spring-Context.xml] cannot be opened because it does not exist
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:126)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:92)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.myComp.backend.appsecurity.spring.appSecurityManager.loadApplicationContext(appSecurityManager.java:233)
at com.myComp.backend.appsecurity.spring.appSecurityManager.internalInitialize(appSecurityManager.java:106)
at com.myComp.BaseModuleManager.initialize(BaseModuleManager.java:511)
at com.myComp.BaseModuleManager.initialize(BaseModuleManager.java:1)
at com.myComp.backend.BaseBackendManager.initializeSubBackendManagers(BaseBackendManager.java:643)
at com.myComp.backend.BaseBackendManager.prepareSubBackendManagers(BaseBackendManager.java:885)
at com.myComp.backend.BackendManager.internalStart(BackendManager.java:127)
at com.myComp.BaseModuleManager.start(BaseModuleManager.java:574)
at com.myComp.BaseModuleManager.start(BaseModuleManager.java:1)
at com.myComp.application.BaseApplicationStub.startBackendManager(BaseApplicationStub.java:2407)
at com.myComp.Application.frameworkEvent(Application.java:72)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:874)
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)Caused by: java.io.FileNotFoundException: class path resource [com/myComp/backend/appsecurity/spring/resources/Spring-Context.xml] cannot be opened because it does not exist
at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:158)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:328)
.. 26 more
Как бы я ни искал в Интернете, единственная рекомендация по этому вопросу заканчивается приложением на SpringDM, но для нашего ProjectManager недопустимо переключаться на SpringDM и, честно говоря, я понятия не имею о SpringDM.
Не могли бы вы помочь мне решить эту проблему с помощью функций Spring Core.
Большое спасибо
Moein
1 ответ
Вам на самом деле не нужна Spring DM. Он просто обеспечивает мост между OSGi и Spring с некоторыми тонкостями, такими как правильная загрузка всех ваших контекстных файлов в среде OSGi. Вы можете сделать это и сами, но вы должны компенсировать проблемы с загрузкой классов, что является вашей проблемой.
Попробуйте это исправить ваши проблемы с загрузкой классов.
ApplicationContext ctx = new ClassPathXmlApplicationContext(myCtxPath)
{
protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader)
{
super.initBeanDefinitionReader(reader);
reader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
reader.setBeanClassLoader(getClassLoader());
}
}
Кстати, вторая строка вашего метода не имеет смысла.