views:

254

answers:

1

I'm now using Apache CXF as a web services client for a .NET service to get around NTLM authentication. It works great, but I'm wondering why I can't seem to be able to set the web service target endpoint. CXF seems to want the WSDL at runtime for some strange reason - not sure. It takes the physical endpoint from the WSDL, which works fine in test environments I guess, but at deployment time it's sure to change.

Here's some code to demonstrate:

        MyWebServices service = new MyWebServices ();
        MyWebServicesSoap port = service.getMyWebServicesSoap12();

        // Turn off chunking so that NTLM can occur
        Client client = ClientProxy.getClient(port);
        HTTPConduit http = (HTTPConduit) client.getConduit();
        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setConnectionTimeout(36000);
        httpClientPolicy.setAllowChunking(false);
        http.setClient(httpClientPolicy);

        port.doSomethingUseful();

Again, there is no place that I can see in the CXF client API that allows me to set the service endpoint. Not that I can see anyway. In this case, the target is http://localhost/integration/webservices/mywebservices.asmx, but I could be anywhere. Surely this pedestrian problem is solved somehow?

+1  A: 

Try the following:

MyWebServicesSoap port = service.getMyWebServicesSoap12();
BindingProvider provider = (BindingProvider) port;
provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint); 

Alternatively, MyWebServices might have other getXXX methods that take a URL for the WSDL location

Kevin
not sure what you mean by your last statement here
arcticpenguin
In the MyServices class, are there other methods that will return a port that accept a URL parameter? Can you edit your post to paste the signature of that class?
Kevin
works like a charm - thanks
arcticpenguin