Ресурс OpenSAML3 не найден «default-config.xml» в контейнере OSGi

Я пытаюсь выполнить обновление до OpenSAML 3 в пакете OSGi, работающем на Apache Karaf (4.0.5), используя пакет сервисных миксов opensaml (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, выпущенный самим сервисмиксом, должен работать как есть...


person Clauds    schedule 21.06.2016    source источник


Ответы (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 в моем комплекте не загружается, и я еще не придумал, как это исправить. Мой текущий обходной путь явно вызывает методы инициализации нужных мне инициализаторов:

  • 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
person Clauds    schedule 17.08.2016

У меня те же проблемы, но с Apache Felix OSGI. С «ресурсом не найден» вы правы, поскольку я обнаружил, что в среде OSGI используется много загрузчиков классов для пакетов, но платформа 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();

Вторая проблема связана с пакетом сервисных миксов opensaml, он содержит ссылки на инициализаторы сервисов только для модуля CORE, вы можете найти его в META-INF/services, я решаю эту проблему, инициализируя эти сервисы в моем пользовательском инициализаторе.

Я пытался связаться с разработчиками servicemix, чтобы указать им на эту проблему, но безуспешно.

person Alexander Mikheev    schedule 29.05.2017