title: How to return custom SOAP Error from Spring Boot Endpoint Service?
body: <p>I have set up an Webservice application which receives and just logs SOAP requests from a third party. After logging a defined response has to be returned. This works without problems if there are no errors and the received SOAP requests match the WSDL.
  Unfortunately the third party also expects a proper SOAP response when it sends invalid content or even random data.</p>
  
  <p>In case the request contains random data (eg "zewrzasjkfklj") my Service returns a HTTP/400 Bad Request with an empty body.
  In case the request containx XML but NOT Soap (eg. "") the Service returns a HTTP/500 Server Error with a JSON Body</p>
  
  <pre><code>{"timestamp":"2018-12-06T16:16:29.375+0000","status":500,"error":"Internal Server Error","message":"Could not create message from InputStream: Unable to create envelope from given source: ; nested exception is com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Unable to create envelope from given source: ","path":"/NotificationServicePort"}
  </code></pre>
  
  <p>This is especially confusing to me as I have no trace or configuration anywhere in the project relating to JSON.</p>
  
  <p>The endpoint is a class annotated with @Endpoint which implements</p>
  
  <pre><code>...    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "notify")
      @ResponsePayload
      public JAXBElement&lt;NotifyResponse&gt; notify(@RequestPayload Notify request) {
  ...}
  </code></pre>
  
  <p>(but this method is never reached in case of the invalid requests).</p>
  
  <p>I already tried to implement/provide Interceptors, Dispatchers, ErrorMappers, ... but the results did not change.
  It seems that in the latter case (valid XML but no SOAP) it fails when attempting to extract the Envelope at SOAPPartImpl.lookForEnvelope() and fails with a
  throw new SOAPExceptionImpl("Unable to create envelope from given source because the root element is not named \"Envelope\"");
  A breakpoint at that error gives the following stack:</p>
  
  <pre><code>lookForEnvelope:153, SOAPPartImpl (com.sun.xml.internal.messaging.saaj.soap)
  getEnvelope:121, SOAPPartImpl (com.sun.xml.internal.messaging.saaj.soap)
  createEnvelope:110, EnvelopeFactory (com.sun.xml.internal.messaging.saaj.soap)
  createEnvelopeFromSource:69, SOAPPart1_1Impl (com.sun.xml.internal.messaging.saaj.soap.ver1_1)
  getEnvelope:128, SOAPPartImpl (com.sun.xml.internal.messaging.saaj.soap)
  createWebServiceMessage:189, SaajSoapMessageFactory (org.springframework.ws.soap.saaj)
  createWebServiceMessage:60, SaajSoapMessageFactory (org.springframework.ws.soap.saaj)
  receive:92, AbstractWebServiceConnection (org.springframework.ws.transport)
  handleConnection:87, WebServiceMessageReceiverObjectSupport (org.springframework.ws.transport.support)
  handle:61, WebServiceMessageReceiverHandlerAdapter (org.springframework.ws.transport.http)
  doService:293, MessageDispatcherServlet (org.springframework.ws.transport.http)
  processRequest:974, FrameworkServlet (org.springframework.web.servlet)
  doPost:877, FrameworkServlet (org.springframework.web.servlet)
  service:661, HttpServlet (javax.servlet.http)
  service:851, FrameworkServlet (org.springframework.web.servlet)
  service:742, HttpServlet (javax.servlet.http)
  internalDoFilter:231, ApplicationFilterChain (org.apache.catalina.core)
  doFilter:166, ApplicationFilterChain (org.apache.catalina.core)
  doFilter:52, WsFilter (org.apache.tomcat.websocket.server)
  internalDoFilter:193, ApplicationFilterChain (org.apache.catalina.core)
  doFilter:166, ApplicationFilterChain (org.apache.catalina.core)
  doFilterInternal:246, AbstractRequestLoggingFilter (org.springframework.web.filter)
  doFilter:107, OncePerRequestFilter (org.springframework.web.filter)
  internalDoFilter:193, ApplicationFilterChain (org.apache.catalina.core)
  doFilter:166, ApplicationFilterChain (org.apache.catalina.core)
  filterAndRecordMetrics:158, WebMvcMetricsFilter (org.springframework.boot.actuate.metrics.web.servlet)
  filterAndRecordMetrics:126, WebMvcMetricsFilter (org.springframework.boot.actuate.metrics.web.servlet)
  doFilterInternal:111, WebMvcMetricsFilter (org.springframework.boot.actuate.metrics.web.servlet)
  doFilter:107, OncePerRequestFilter (org.springframework.web.filter)
  internalDoFilter:193, ApplicationFilterChain (org.apache.catalina.core)
  doFilter:166, ApplicationFilterChain (org.apache.catalina.core)
  doFilterInternal:90, HttpTraceFilter (org.springframework.boot.actuate.web.trace.servlet)
  doFilter:107, OncePerRequestFilter (org.springframework.web.filter)
  internalDoFilter:193, ApplicationFilterChain (org.apache.catalina.core)
  doFilter:166, ApplicationFilterChain (org.apache.catalina.core)
  doFilter:320, FilterChainProxy$VirtualFilterChain (org.springframework.security.web)
  invoke:127, FilterSecurityInterceptor (org.springframework.security.web.access.intercept)
  doFilter:91, FilterSecurityInterceptor (org.springframework.security.web.access.intercept)
  doFilter:334, FilterChainProxy$VirtualFilterChain (org.springframework.security.web)
  doFilter:119, ExceptionTranslationFilter (org.springframework.security.web.access)
  doFilter:334, FilterChainProxy$VirtualFilterChain (org.springframework.security.web)
  doFilter:137, SessionManagementFilter (org.springframework.security.web.session)
  doFilter:334, FilterChainProxy$VirtualFilterChain (org.springframework.security.web)
  doFilter:111, AnonymousAuthenticationFilter (org.springframework.security.web.authentication)
  doFilter:334, FilterChainProxy$VirtualFilterChain (org.springframework.security.web)
  doFilter:170, SecurityContextHolderAwareRequestFilter (org.springframework.security.web.servletapi)
  doFilter:334, FilterChainProxy$VirtualFilterChain (org.springframework.security.web)
  doFilter:63, RequestCacheAwareFilter (org.springframework.security.web.savedrequest)
  doFilter:334, FilterChainProxy$VirtualFilterChain (org.springframework.security.web)
  doFilterInternal:158, BasicAuthenticationFilter (org.springframework.security.web.authentication.www)
  doFilter:107, OncePerRequestFilter (org.springframework.web.filter)
  doFilter:334, FilterChainProxy$VirtualFilterChain (org.springframework.security.web)
  doFilter:116, LogoutFilter (org.springframework.security.web.authentication.logout)
  doFilter:334, FilterChainProxy$VirtualFilterChain (org.springframework.security.web)
  doFilterInternal:66, HeaderWriterFilter (org.springframework.security.web.header)
  doFilter:107, OncePerRequestFilter (org.springframework.web.filter)
  doFilter:334, FilterChainProxy$VirtualFilterChain (org.springframework.security.web)
  doFilter:105, SecurityContextPersistenceFilter (org.springframework.security.web.context)
  doFilter:334, FilterChainProxy$VirtualFilterChain (org.springframework.security.web)
  doFilterInternal:56, WebAsyncManagerIntegrationFilter (org.springframework.security.web.context.request.async)
  doFilter:107, OncePerRequestFilter (org.springframework.web.filter)
  doFilter:334, FilterChainProxy$VirtualFilterChain (org.springframework.security.web)
  doFilterInternal:215, FilterChainProxy (org.springframework.security.web)
  doFilter:178, FilterChainProxy (org.springframework.security.web)
  invokeDelegate:357, DelegatingFilterProxy (org.springframework.web.filter)
  doFilter:270, DelegatingFilterProxy (org.springframework.web.filter)
  internalDoFilter:193, ApplicationFilterChain (org.apache.catalina.core)
  doFilter:166, ApplicationFilterChain (org.apache.catalina.core)
  doFilterInternal:99, RequestContextFilter (org.springframework.web.filter)
  doFilter:107, OncePerRequestFilter (org.springframework.web.filter)
  internalDoFilter:193, ApplicationFilterChain (org.apache.catalina.core)
  doFilter:166, ApplicationFilterChain (org.apache.catalina.core)
  doFilterInternal:109, HttpPutFormContentFilter (org.springframework.web.filter)
  doFilter:107, OncePerRequestFilter (org.springframework.web.filter)
  internalDoFilter:193, ApplicationFilterChain (org.apache.catalina.core)
  doFilter:166, ApplicationFilterChain (org.apache.catalina.core)
  doFilterInternal:93, HiddenHttpMethodFilter (org.springframework.web.filter)
  doFilter:107, OncePerRequestFilter (org.springframework.web.filter)
  internalDoFilter:193, ApplicationFilterChain (org.apache.catalina.core)
  doFilter:166, ApplicationFilterChain (org.apache.catalina.core)
  doFilterInternal:200, CharacterEncodingFilter (org.springframework.web.filter)
  doFilter:107, OncePerRequestFilter (org.springframework.web.filter)
  internalDoFilter:193, ApplicationFilterChain (org.apache.catalina.core)
  doFilter:166, ApplicationFilterChain (org.apache.catalina.core)
  invoke:198, StandardWrapperValve (org.apache.catalina.core)
  invoke:96, StandardContextValve (org.apache.catalina.core)
  invoke:496, AuthenticatorBase (org.apache.catalina.authenticator)
  invoke:140, StandardHostValve (org.apache.catalina.core)
  invoke:81, ErrorReportValve (org.apache.catalina.valves)
  invoke:87, StandardEngineValve (org.apache.catalina.core)
  service:342, CoyoteAdapter (org.apache.catalina.connector)
  service:803, Http11Processor (org.apache.coyote.http11)
  process:66, AbstractProcessorLight (org.apache.coyote)
  process:790, AbstractProtocol$ConnectionHandler (org.apache.coyote)
  doRun:1468, NioEndpoint$SocketProcessor (org.apache.tomcat.util.net)
  run:49, SocketProcessorBase (org.apache.tomcat.util.net)
  runWorker:1149, ThreadPoolExecutor (java.util.concurrent)
  run:624, ThreadPoolExecutor$Worker (java.util.concurrent)
  run:61, TaskThread$WrappingRunnable (org.apache.tomcat.util.threads)
  run:748, Thread (java.lang)
  </code></pre>
  
  <p>I would be grateful for  any hints or further suggestions where I can find more information on how to set up a default SOAP response (or a HTML response which has text contents of a SOAP message) if the request did not even reach the SOAP processing logic.</p>