Ресурс OpenSAML3 не найден "default-config.xml" в контейнере OSGi
Я пытаюсь обновить систему до OpenSAML 3 в пакете OSGi, работающем на Apache Karaf (4.0.5), с использованием комплекта opensaml servicemix (org.apache.servicemix.bundles:org.apache.servicemix.bundles.opensaml:jar:3.2.0_1
).
Тест, который разбирает SAML, работает, поэтому я думаю, что я на правильном пути. Однако, если я устанавливаю пакет на Karaf, я получаю ошибку "ресурс не найден", когда он пытается загрузить default-config.xml
,
2016-06-21 16:29:10,477 | INFO | ool-120-thread-1 | InitializationService | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | Initializing OpenSAML using the Java Services API
2016-06-21 16:29:10,478 | DEBUG | ool-120-thread-1 | InitializationService | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | Initializing module initializer implementation: org.opensaml.core.xml.config.XMLObjectProviderInitializer
2016-06-21 16:29:10,487 | DEBUG | ool-120-thread-1 | XMLConfigurator | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | XMLObjectProviderRegistry did not exist in ConfigurationService, will be created
2016-06-21 16:29:10,488 | DEBUG | ool-120-thread-1 | ractXMLObjectProviderInitializer | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | Loading XMLObject provider configuration from resource 'default-config.xml'
2016-06-21 16:29:10,489 | ERROR | ool-120-thread-1 | ractXMLObjectProviderInitializer | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | Problem loading configuration resource
org.opensaml.core.xml.config.XMLConfigurationException: Resource not found
at org.opensaml.core.xml.config.AbstractXMLObjectProviderInitializer.init(AbstractXMLObjectProviderInitializer.java:54)[388:org.apache.servicemix.bundles.opensaml:3.2.0.1]
at org.opensaml.core.xml.config.XMLObjectProviderInitializer.init(XMLObjectProviderInitializer.java:45)[388:org.apache.servicemix.bundles.opensaml:3.2.0.1]
at org.opensaml.core.config.InitializationService.initialize(InitializationService.java:56)[388:org.apache.servicemix.bundles.opensaml:3.2.0.1]
AbstractXMLObjectProviderInitializer
загружает ресурс следующим образом (resource
является default-config.xml
):
Thread.currentThread().getContextClassLoader().getResourceAsStream(resource)
default-config.xml
находится в корне банки (opensaml), что заставляет меня задуматься, не является ли это причиной, по которой ее нельзя найти.
Я использую maven-bundle-plugin
в моем проекте и в дополнение к зависимости и различным использованиям opensaml я обеспечил явный импорт (Import-Package
) для следующих пакетов:
org.opensaml.core.xml.config,
org.opensaml.saml.config,
org.opensaml.xmlsec.config,
Есть ли что-то, чего мне не хватает в манифесте моего комплекта или где-либо еще, чтобы заставить эту работу? Я полагаю, что пакет opensaml, выпущенный самим servicemix, должен работать как есть...
2 ответа
Я нашел решение проблемы "ресурс не найден", но это взломать больше всего на свете...
После того, как я наткнулся на сообщение SO. Улучшенная обработка Thread Context ClassLoader в OSGi, я адаптировал свой код для установки загрузчика классов InitializationService
перед вызовом соответствующий XML-файл теперь находится во время инициализации.
// adapt TCCL
Thread thread = Thread.currentThread();
ClassLoader loader = thread.getContextClassLoader();
thread.setContextClassLoader(InitializationService.class.getClassLoader());
try {
InitializationService.initialize();
} finally {
// reset TCCL
thread.setContextClassLoader(loader);
}
Тем не менее, я заметил, что конфигурация SPI org.opensaml.core.config.Initializer
у меня в комплекте не грузится и я пока не разобрался в правильном решении для этого. Мой текущий обходной путь явно вызывает методы init инициализаторов, которые мне нужны:
org.opensaml.saml.config.XMLObjectProviderInitializer
org.opensaml.saml.config.SAMLConfigurationInitializer
org.opensaml.xmlsec.config.XMLObjectProviderInitializer
Имейте в виду, что следующие также необходимы, но инициализируются по умолчанию (из-за конфигурации SPI org.opensaml.core.config.Initializer
в комплекте opensaml - который загружается):
org.opensaml.core.xml.config.XMLObjectProviderInitializer
org.opensaml.core.xml.config.GlobalParserPoolInitializer
У меня такие же проблемы, но с Apache Felix OSGI. С "ресурсом не найден" вы правы, как я обнаружил, в среде OSGI используется много ClassLoaders для пакетов, но среда SAML v3 загружает ресурсы следующим образом:
ClassLoader classLoader =Thread.currentThread().getContextClassLoader();
Class<?> clazz = classLoader.loadClass(className);
//And same in InitializationService
ServiceLoader<Initializer> serviceLoader = getServiceLoader();
Iterator iter = serviceLoader.iterator();
Ваше решение работает для инициализации, но для меня, когда я пытаюсь подписать сообщение или подтвердить, все еще есть эта проблема, поэтому я заменяю загрузку ресурсов комплектом ClassLoader везде:
BundleWiring bundleWiring = bundleContext.getBundle().adapt(BundleWiring.class);
ClassLoader loader = bundleWiring.getClassLoader();
Вторая проблема - это проблема с комплектом servicemix opensaml, он содержит ссылки на инициализаторы сервисов только для модуля CORE, вы можете найти его в META-INF/services, я решаю эту проблему, инициализируя эти сервисы в моем пользовательском инициализаторе.
Я пытался связаться с разработчиками ServiceMix, чтобы указать им, что проблема, но безуспешно.