Hi Freeman,

Yep, it helps.

It is still a little bit strange why registration without  
http://cxf.apache.org/transports/http and  
http://cxf.apache.org/transports/http/configuration (like it shown in wiki for 
local transport: http://cxf.apache.org/docs/local-transport.html ) works for 
some scenarios and for some scenarios - no.

Regards,
Andrei.

-----Original Message-----
From: Freeman Fang [mailto:[email protected]] 
Sent: Montag, 17. Januar 2011 14:30
To: [email protected]
Subject: Re: Registration of custom transport factory is overwritten if service 
created with WSDL URL

Hi,

If you want to your customer transport to override cxf http transport, you 
should register those transport ids with your customer transport 
http://cxf.apache.org/transports/http
http://cxf.apache.org/transports/http/configuration
http://schemas.xmlsoap.org/wsdl/http
http://schemas.xmlsoap.org/wsdl/http/

which already defined in bus-extensions.xml for both rt/transports/ http and 
rt/transports/http-jetty,

the register transport part is incorrect,  it should be

                Bus bus = BusFactory.getDefaultBus()
                DestinationFactoryManagerImpl dfm = new 
DestinationFactoryManagerImpl(bus);
                 SBBTransportFactory sbbTransport = new SBBTransportFactory();
                 
dfm.registerDestinationFactory("http://cxf.apache.org/transports/sbb
", sbbTransport);
                 
dfm.registerDestinationFactory("http://cxf.apache.org/transports/http
", sbbTransport);
                 
dfm.registerDestinationFactory("http://cxf.apache.org/transports/http/configuration
", sbbTransport);
                 
dfm.registerDestinationFactory("http://schemas.xmlsoap.org/wsdl/http
", sbbTransport);
                 
dfm.registerDestinationFactory("http://schemas.xmlsoap.org/wsdl/http/
", sbbTransport);

                 ConduitInitiatorManager extension = 
bus.getExtension(ConduitInitiatorManager.class);
                 
extension.registerConduitInitiator("http://cxf.apache.org/transports/sbb
", sbbTransport);
                 
extension.registerConduitInitiator("http://cxf.apache.org/transports/http
", sbbTransport);
                 
extension.registerConduitInitiator("http://cxf.apache.org/transports/http/configuration
", sbbTransport);
                 
extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/http
", sbbTransport);
                
extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/http/
", sbbTransport);
with this change, all your testcase pass.

Freeman

On 2011-1-17, at 下午8:30, Andrei Shakirin wrote:

> Hi folks,
>
> By developing of custom CXF transport factory I faced one strange 
> behavior looks like a bug.
>
> Scenario:
> 1. I register my factory using
>             Bus bus = BusFactory.getDefaultBus();
>             DestinationFactoryManagerImpl dfm = new 
> DestinationFactoryManagerImpl(bus);
>             SBBTransportFactory sbbTransport = new 
> SBBTransportFactory();
>             
> dfm.registerDestinationFactory("http://cxf.apache.org/transports/sbb
> ", sbbTransport);
>             
> dfm.registerDestinationFactory("http://schemas.xmlsoap.org/soap/http
> ", sbbTransport);
>             
> dfm.registerDestinationFactory("http://schemas.xmlsoap.org/wsdl/soap/h
> ttp
> ", sbbTransport);
>
>             ConduitInitiatorManager extension = 
> bus.getExtension(ConduitInitiatorManager.class);
>             
> extension.registerConduitInitiator("http://cxf.apache.org/transports/s
> bb
> ", sbbTransport);
>             
> extension.registerConduitInitiator("http://schemas.xmlsoap.org/soap/ht
> tp
> ", sbbTransport);
>             
> extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/so
> ap/http
> ", sbbTransport);
>
> 2. If I call consumer via ClientProxyFactoryBean or via Service 
> without WSDL URL:
>           Service service = Service.create(SERVICE_NAME);
>          HelloWorld hw = service.getPort(HelloWorld.class);
>           hw.write(TEST_REQUEST);
> my factory is activated as expected -ok.
>
> 3. If I try to call consumer via Service, but additionally pass WSDL
> URL:
>         URL wsdlURL = this.getClass().getResource("/HelloWorld.wsdl");
>         Service service = Service.create(wsdlURL, SERVICE_NAME);
>         HelloWorld hw = service.getPort(HelloWorld.class);
>         String result = hw.sayHi(TEST_REQUEST); my factory is not 
> activated.
> But if I make the same registration again after getPort() call - it 
> works.
> It seems that registration in this case is somehow overwritten and 
> should be actualized.
>
> I attach the small project illustrated this effect.
> consumerRequestResponseOK - use service without WSDL URL 
> consumerRequestResponseFailed - iluustrates the problem 
> consumerRequestResponseFixed - shows the fix.
>
> Another workaround is just to read DestinationFactory and 
> ConduitInitor before registration (call printRegistration() in 
> setup()).
>
> Do you have any ideas regarding this effect?
> For me it looks like a bug.
>
> Regards,
> Andrei.
>
>
>
>
>
>
> <cxf-transport-registration.zip>


--
Freeman Fang

------------------------

FuseSource: http://fusesource.com
blog: http://freemanfang.blogspot.com
twitter: http://twitter.com/freemanfang
Apache Servicemix:http://servicemix.apache.org
Apache Cxf: http://cxf.apache.org
Apache Karaf: http://karaf.apache.org
Apache Felix: http://felix.apache.org

Reply via email to