问题
I'm trying to upgrade to OpenSAML 3 in an OSGi bundle running on Apache Karaf (4.0.5) using opensaml servicemix bundle (org.apache.servicemix.bundles:org.apache.servicemix.bundles.opensaml:jar:3.2.0_1
).
A test that parses the SAML is working so I think I'm on the right track. However, if I install the bundle on Karaf I get a "resource not found" error when it's trying to load 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
is loading the resource as follows (resource
is default-config.xml
):
Thread.currentThread().getContextClassLoader().getResourceAsStream(resource)
default-config.xml
is located in the root of the (opensaml) jar which makes me wonder if that's the reason it cannot be found.
I'm using the maven-bundle-plugin
in my project and on top of the dependency and various uses of opensaml classes I provided explicit imports (Import-Package
) for the following packages:
org.opensaml.core.xml.config,
org.opensaml.saml.config,
org.opensaml.xmlsec.config,
Is there anything I am missing in my bundle's manifest or elsewhere to make this work? I presume the opensaml bundle released by servicemix itself should be working as is...
回答1:
I found a solution to the "resource not found" issue but it's a hack more than anything...
After stumbling across the SO post Better handling of Thread Context ClassLoader in OSGi I adapted my code to set the classloader of the InitializationService
before calling it, the XML in question is now found during initialization.
// adapt TCCL
Thread thread = Thread.currentThread();
ClassLoader loader = thread.getContextClassLoader();
thread.setContextClassLoader(InitializationService.class.getClassLoader());
try {
InitializationService.initialize();
} finally {
// reset TCCL
thread.setContextClassLoader(loader);
}
However, I've noticed that the SPI config org.opensaml.core.config.Initializer
in my bundle does not get loaded and I have not figured out a proper fix for that yet. My current workaround is explicitly calling the init methods of initializers I need:
org.opensaml.saml.config.XMLObjectProviderInitializer
org.opensaml.saml.config.SAMLConfigurationInitializer
org.opensaml.xmlsec.config.XMLObjectProviderInitializer
Mind that the following are required as well but get initialized per default (because of SPI config org.opensaml.core.config.Initializer
in opensaml bundle - which does get loaded):
org.opensaml.core.xml.config.XMLObjectProviderInitializer
org.opensaml.core.xml.config.GlobalParserPoolInitializer
回答2:
I have the same problems, but with Apache Felix OSGI. With "resource not found" you are right, as I found in OSGI environment uses many ClassLoaders for bundles, but SAML v3 framework loads resources like this:
ClassLoader classLoader =Thread.currentThread().getContextClassLoader();
Class<?> clazz = classLoader.loadClass(className);
//And same in InitializationService
ServiceLoader<Initializer> serviceLoader = getServiceLoader();
Iterator iter = serviceLoader.iterator();
Your solution works for initialization, but for me, when I trying to Sign message, or validate, still have this problem, so I replace resource loading with bundle ClassLoader everywhere:
BundleWiring bundleWiring = bundleContext.getBundle().adapt(BundleWiring.class);
ClassLoader loader = bundleWiring.getClassLoader();
The second problem is problem with opensaml servicemix bundle, it contains service initializers references only for CORE module, you can find it in META-INF/services, I solve this problem by initializing this services in my custom initializer.
I was trying to contact with servicemix developers to indicate them that problem but unsuccessfully.
来源:https://stackoverflow.com/questions/37948303/opensaml3-resource-not-found-default-config-xml-in-osgi-container