Just posting the Dan's answer:

> Hi,
> 
> Just would like to check the following thing in CXF architecture:
> As I understand WSDL  is initialized quite early on the Client side. 
> If wsdlLocation attribute is defined in client spring configuration, 
> JaxWsProxyFactoryBean -> ClientFactoryBean -> 
> ReflectionServiceFactoryBean get WSDL from the location and build 
> Service Model. At this point service endpoint and policy attachments 
> are loaded. When client proxy is injected, it has already pre-initialized 
> endpoint and policies from WSDL.

All correct.


> 
> Question: is there any possibility to update WSDL dynamically (for 
> example load from another location with updated endpoint and policies) 
> after client proxy is injected?

Not at this time, no.    It's actually even worse than you think.    In some 
cases, even discarding the client and creating a new one wouldn't even work.   
The WSDLManager in CXF caches the WSDL's so creating a new client proxy might 
not even cause a new WSDL to be downloaded.


> Use case: service is looked up dynamically via service
> registry and client should make some decisions which service wsdl will be
> used in callbacks handler. Therefore possible solution will be just to tell
> client after ServiceRegistry lookup and callback calls - this is new WSDL
> url with updated endpoint and updated policies. As far as I can see it is
> not possible in CXF now, but just ask it to be sure.

Well, an interceptor at the very beginning of the chain CAN manipulate a few 
things.   Things like the address can likely be modified.   Policies could be 
replaced/removed, etc...   Nothing really built into CXF, but it is something 
that is doable.  
 
> Alternative solution is update only endpoint in ConduitSelector (like
> ServiceLocator is doing) and set policies dynamically using POLICY_OVERLOAD
> property. WSDL solution is more standard and elegant, but seems to be not
> possible now in CXF.

I'd really need to think about this more.   Even from the ConduitSelector, I 
think you could completely replace the policies in the Service model if you 
wanted to go that route instead of the POLICY_OVERLOAD method.   


-- 
Daniel Kulp

-----Original Message-----
From: Andrei Shakirin [mailto:ashaki...@talend.com] 
Sent: 01 February 2012 16:10
To: dev@cxf.apache.org
Subject: Dynamic WSDL location by CXF Consumer

Hi,

Just would like to check the following thing in CXF architecture:
As I understand WSDL  is initialized quite early on the Client side. If 
wsdlLocation attribute is defined in client spring configuration, 
JaxWsProxyFactoryBean -> ClientFactoryBean -> ReflectionServiceFactoryBean get 
WSDL from the location and build Service Model. At this point service endpoint 
and policy attachments are loaded. When client proxy is injected, it has 
already pre-initialized endpoint and policies from WSDL.

Question: is there any possibility to update WSDL dynamically (for example load 
from another location with updated endpoint and policies) after client proxy is 
injected?
Use case: service is looked up dynamically via service registry and client 
should make some decisions which service wsdl will be used in callbacks 
handler. Therefore possible solution will be just to tell client after 
ServiceRegistry lookup and callback calls - this is new WSDL url with updated 
endpoint and updated policies.
As far as I can see it is not possible in CXF now, but just ask it to be sure.

Alternative solution is update only endpoint in ConduitSelector and set 
policies dynamically using POLICY_OVERLOAD property.
WSDL solution seems to be more elegant, but I am not sure is it possible now in 
CXF.

Regards,
Andrei.

Reply via email to