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?
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.