415 Unsupported Media Exception even after setting application/soap+xml for SOAP 1.2 call

1k Views Asked by At

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/:?]
1

There are 1 best solutions below

0
On

@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


@Bean
WebServiceMessageFactory messageFactory()
{
   SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory();
   messageFactory.setSoapVersion(SoapVersion.SOAP_12);
   return messageFactory;
}

and below mentioned line to the method soapConnector() on SoapConfig class to enforce SOAP v1.2 protocol.

client.setMessageFactory(messageFactory());

Please let me know how it goes.