I am getting org.springframework.ws.client.WebServiceTransportException: Unsupported Media Type [415] when trying for a SOAP call. The code is as follows:
public class SoapClient extends WebServiceGatewaySupport {
public RunReportResponse getCostingDetails(RunReport request) {
return (RunReportResponse) getWebServiceTemplate()
.marshalSendAndReceive(
"https://domain:443/xmlpserver/services/ReportService"
,request);
}
}
SoapConfig.java
@Configuration
public class SoapConfig {
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller=new Jaxb2Marshaller();
marshaller.setContextPath("com.report.dto");
return marshaller;
}
@Bean
public SoapClient soapConnector() {
SoapClient client = new SoapClient();
client.setDefaultUri("https://domain:443/xmlpserver/services/ReportService");
client.setMarshaller(marshaller());
client.setUnmarshaller(marshaller());
client.setMessageSender(httpComponentsMessageSender());
return client;
}
@Bean
public HttpComponentsMessageSender httpComponentsMessageSender() {
return new HttpComponentsMessageSender(createHttpClient());
}
@Bean
HttpClient createHttpClient() {
List<Header> headers = new ArrayList<>();
BasicHeader authHeader = new BasicHeader("Authorization", "Basic username:password");
BasicHeader contentType = new BasicHeader(HttpHeaders.CONTENT_TYPE, "application/soap+xml");
headers.add(contentType);
headers.add(authHeader);
// add more header as more as needed
RequestDefaultHeaders reqHeader = new RequestDefaultHeaders(headers);
return HttpClients.custom()
.addInterceptorFirst(new HttpComponentsMessageSender.RemoveSoapHeadersInterceptor())
.addInterceptorLast(reqHeader)
.build();
}
}
I am calling the getCostingDetails() through a Controller class, but receiving the error:
ERROR[http-nio-8080-exec-1] [dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.ws.client.WebServiceTransportException: Unsupported Media Type [415]] with root cause
org.springframework.ws.client.WebServiceTransportException: Unsupported Media Type [415]
at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:695) ~[spring-ws-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]
at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:606) ~[spring-ws-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555) ~[spring-ws-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390) ~[spring-ws-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:378) ~[spring-ws-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]
at com.report.client.SoapClient.getCostingDetails(SoapClient.java:11) ~[main/:?]
@Akshita Mathur Issue should be the SOAP protocol version of the client not matching the protocol version of the server. With SOAP protocol v1.0 spring boot generates the Content-Type as text/xml and for SOAP v1.2 it generates the Content-Type in request header as application/soap+xml. By default spring boot soap client points to SOAP protocol v1.0. Please refer to the below mentioned code if you want to re-point the SOAP protocol version of the client to v1.2.
Please add the below mentioned bean to SoapClient class
and below mentioned line to the method soapConnector() on SoapConfig class to enforce SOAP v1.2 protocol.
Please let me know how it goes.