servicemix-cxf-bc endpoint cannot load busCfg file when packaged as an OSGi
bundle
----------------------------------------------------------------------------------
Key: SMXCOMP-688
URL: https://issues.apache.org/activemq/browse/SMXCOMP-688
Project: ServiceMix Components
Issue Type: Bug
Components: servicemix-cxf-bc
Affects Versions: servicemix-cxf-bc-2009.02
Environment: apache-servicemix-4.1.0-SNAPSHOT build 164
OSX
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04-248-10M3025)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01-101, mixed mode)
Reporter: Paul Mietz Egli
Attachments: smx4-bus-config.tar.gz, smx4-provided-bus.diff
I've been attempting to set up CXF to use digest authentication by specifying a
value for the busCfg attribute of a cxfbc:provider endpoint. When I use a
relative file path like the example code, I get a "Failed to load configuration
com/example/cxf/bus.xml", which I more or less would expect. Using a
"classpath:" prefix for the attribute value, I this IllegalArgumentException:
Caused by: java.lang.IllegalArgumentException: name
at sun.misc.URLClassPath$Loader.findResource(URLClassPath.java:458)
at sun.misc.URLClassPath.findResource(URLClassPath.java:145)
at java.net.URLClassLoader$2.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findResource(URLClassLoader.java:359)
at java.lang.ClassLoader.getResource(ClassLoader.java:1040)
at
org.springframework.osgi.context.internal.classloader.ChainedClassLoader.doGetResource(ChainedClassLoader.java:128)
at
org.springframework.osgi.context.internal.classloader.ChainedClassLoader.getResource(ChainedClassLoader.java:110)
at
org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:160)
at
org.springframework.core.io.ClassPathResource.getFile(ClassPathResource.java:175)
at
org.springframework.core.io.AbstractResource.exists(AbstractResource.java:51)
at
org.apache.cxf.bus.spring.BusApplicationContext.findResource(BusApplicationContext.java:196)
at
org.apache.cxf.bus.spring.BusApplicationContext.getConfigResources(BusApplicationContext.java:144)
at
org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:107)
at
org.apache.cxf.bus.spring.BusApplicationContext.loadBeanDefinitions(BusApplicationContext.java:262)
at
org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
at
org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:422)
at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
at
org.apache.cxf.bus.spring.BusApplicationContext.<init>(BusApplicationContext.java:91)
at
org.apache.cxf.bus.spring.SpringBusFactory.createApplicationContext(SpringBusFactory.java:102)
at
org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:93)
at
org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:88)
at
org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:64)
at
org.apache.servicemix.cxfbc.CxfBcProvider.getBus(CxfBcProvider.java:601)
at
org.apache.servicemix.cxfbc.CxfBcProvider.validate(CxfBcProvider.java:422)
... 41 more
Using a debugger, I can see that the ChainedClassLoader contains the following
objects:
[BundleDelegatingClassLoader for [ServiceMix :: CXF Binding Component
(servicemix-cxf-bc)], 37.0, 40.0, 42.0, 69.0]
where 37 is spring-aop, 40 is cglib, 42 is spring-osgi-core, and 69 is
servicemix-common. There is no bundle classloader for my bundle, so even
though I've exported com/example/cxf, I wouldn't expect the ChainedClassLoader
to find it.
It seems to me that we have a chicken-and-egg problem: we need the bus to
validate the component, yet we can't load the bus configuration from our bundle
when the component is being validated. I thought about attaching a fragment
bundle to the CXF binding component, but I'm not sure if that would work and it
seems like a lot of trouble.
One way around the issue would be to create a means of setting the bus object
using Spring, like Camel's CXF component. I'm attaching a patch for
consideration which adds a setBus() method to CxfBcProvider and modifies
getBus() to return the object from setBus() if any. With these changes, I'm
able to configure my CXF bus for Digest auth and provide it to the endpoint.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.