Recently I had the "chance" to consume an old school WebService in good old SOAP on top of that it was a C# WebService using the dataset construct which is in itself a world of pain... but we will not talk about that here
A more easy thing to tackle is the NTLM authentication, below is how I implemented it using Spring and Spring boot :
1. Define a set of custom properties in the application.yaml file
ws: base-url: "http://host/ws.asmx?wsdl" username: "myusername" password: "mypassword" authentication: "NTLM"
2. Map the properties in application.yaml to a Java class
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.stereotype.Component; @Component @EnableConfigurationProperties @ConfigurationProperties(prefix = "app") @Data public class YAMLConfig { private Ws ws; @Data public static class Ws { private String baseUrl; private String username; private String password; private String authentication; } }
import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.apache.cxf.transport.http.HTTPConduit; import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; import org.springframework.stereotype.Service; import org.w3c.dom.Element; import javax.xml.bind.JAXBContext; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; //Injection and other properties omitted for brevity public void consume(){ JaxWsProxyFactoryBean factory1 = new JaxWsProxyFactoryBean(); factory1.setServiceClass(EntityInformationSoap.class); factory1.setAddress(yamlConfig.getWs().getBaseUrl()); factory1.setUsername(yamlConfig.getWs().getUsername()); factory1.setPassword(yamlConfig.getWs().getPassword()); EntityInformationSoap service = (EntityInformationSoap) factory1.create(); Client client = ClientProxy.getClient(service); HTTPConduit conduit = (HTTPConduit) client.getConduit(); conduit.getAuthorization().setAuthorizationType(yamlConfig.getWs().getAuthentication()); conduit.getAuthorization().setUserName(yamlConfig.getWs().getUsername()); conduit.getAuthorization().setPassword(yamlConfig.getWs().getPassword()); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setConnectionTimeout(36000); httpClientPolicy.setAllowChunking(false); conduit.setClient(httpClientPolicy); }