Ресурс 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, чтобы указать им, что проблема, но безуспешно.

Другие вопросы по тегам