On Monday 15 November 2010 11:57:24 am Seumas Soltysik wrote:
> SoapTransportFactory extends AbstractTransportFactory which contains a
> protected Bus data member. However, SoapTransportFactory has its own
> private Bus data member and does not make use of the Bus data member
> inherited from AbstractTransportFactory. Why is this? Is this done on
> purpose or is this an oversight?
Looks like an oversight to me. I'm testing a fix now.
Dan
> public class SoapTransportFactory extends AbstractTransportFactory
> implements DestinationFactory, WSDLEndpointFactory, ConduitInitiator {
> private Bus bus;
> }
>
> public abstract class AbstractTransportFactory {
> protected Bus bus;
> }
>
> In a testcase that I am developing this has led to problems. If I
> initialize an instance of SoapTransportFactory using the
> cxf-extension-soap.xml configuration, setTransportIDs() is called on the
> base class AbstractTransportFactory which ultimately calls register()
> which registers the transport IDs with the bus:
>
> public final void register() {
> if (null == bus) {
> return;
> }
> if (this instanceof DestinationFactory) {
> DestinationFactoryManager dfm =
> bus.getExtension(DestinationFactoryManager.class); if (null != dfm &&
> getTransportIds() != null) {
> for (String ns : getTransportIds()) {
> dfm.registerDestinationFactory(ns,
> (DestinationFactory)this); }
> }
> }
>
> However, because AbstractTransportFactory has its own Bus instance, which
> is not initialized and therefore null, the transport IDs are never
> registered with the Bus instance that is visible to the
> SoapTransportFactory. I think this issue has been disguised by the fact
> that usually SoapTransportFactory is not initialized without initializing
> other transport factories which do the right thing registering namespaces
> with the Bus.
--
Daniel Kulp
[email protected]
http://dankulp.com/blog