Hello,
I have written the following ws:outbound-gateway, which connects to
www.w3schools.com/webservices/tempconvert.asmx and converts Celsius degrees to Fahrenheit,
as a learning exercise:
Here's my Main class:Code:<int:channel id="w3RequestsOutputChannel"/> <int-ws:outbound-gateway id="w3schoolsGateway" request-channel="w3RequestsOutputChannel" uri="http://www.w3schools.com/webservices/tempconvert.asmx" />
Unfortunately, I get an error from the w3schools server saying that the SOAPAction header cannot be read.Code:public final class Main { private static String bodyTemplate0 = "<CelsiusToFahrenheit xmlns=\"http://tempuri.org/\">" + "<Celsius>%s</Celsius>" + "</CelsiusToFahrenheit>" public static void main(final String... args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:META-INF/spring/integration/spring-integration-context.xml"); MessageChannel channel = ctx.getBean("w3RequestsOutputChannel", MessageChannel.class); String body = String.format(bodyTemplate0, "20"); System.out.println(body); MessagingTemplate messagingTemplate = new MessagingTemplate(); MessageBuilder<String> mb = MessageBuilder.withPayload(body); Message<?> message = messagingTemplate. sendAndReceive(channel, mb.build() ); System.out.println(message.getPayload()); } // end main }
Using tcpdump, I have determined that the SOAPAction header is actually empty. As a result, I have added
a SOAP Header Mapper to my channel, which sets the SOAPAction, as follows:
The SOAP request now works. However, it seems silly to have to hard-code the SOAP Action. Is there a way to send a SOAP request without manually setting the SOAP Action?Code:<int:channel id="w3RequestsOutputChannel"/> <int-ws:outbound-gateway id="w3schoolsGateway" request-channel="w3RequestsOutputChannel" uri="$http://www.w3schools.com/webservices/tempconvert.asmx" header-mapper="soapHeaderMapper" /> public class SoapHeaderMapper extends DefaultSoapHeaderMapper { @Override public void populateStandardHeaders(java.util.Map<java.lang.String,java.lang.Object> headers, org.springframework.ws.soap.SoapMessage target) { target.setSoapAction("http://tempuri.org/CelsiusToFahrenheit"); } }
Many thanks.
Philroc


Reply With Quote