We have had a problem with wsdl dynamic address location, exposed by an old web application based on Spring MVC 3.0 behind a Load Balancer. A dynamic wsdl is created at runtime by spring-ws with the tag dynamic-wsdl in the spring-ws context:
<sws:dynamic-wsdl id="myService" portTypeName="myServiceSoap"
locationUri="/ws/MyServiceService" targetNamespace="http://www.myapp.it/myapp/schema/myappws">
<sws:xsd location="/WEB-INF/wsdl/MyService.xsd"/>
</sws:dynamic-wsdl>
the portion of the service wsdl generated was like this:
<wsdl:service name="MySoapService">
<wsdl:port binding="tns:MySoapSoap11" name="MySoapSoap11">
<soap:address location="http://www.myapp.com/myapp/ws/MyService"/>
</wsdl:port>
</wsdl:service>
The scheme of the address location was http instead that https. To solve this, we have to force the schema to https. We have to create a new bean in the application context:
<bean id="myServiceWsdlDefinitionHandlerAdapter" name="wsdlDefinitionHandlerAdapter" class="it.github.parmag.MyServiceWsdlDefinitionHandlerAdapter">
The name must be “wsdlDefinitionHandlerAdapter”. Then the bean could be like this:
public class MyServiceWsdlDefinitionHandlerAdapter extends WsdlDefinitionHandlerAdapter {
public MyServiceWsdlDefinitionHandlerAdapter () {
}
@Override
protected String transformLocation(String location, HttpServletRequest request) {
String newLocation = super.transformLocation(location, request);
newLocation = "https" + newLocation.substring(newLocation.indexOf(":"));
return newLocation;
}
}
Now, the address location is https:
<wsdl:service name="MySoapService">
<wsdl:port binding="tns:MySoapSoap11" name="MySoapSoap11">
<soap:address location="https://www.myapp.com/myapp/ws/MyService"/>
</wsdl:port>
</wsdl:service>