Search code examples
spring-bootheaderaop

Read custom header value from the response


When I send request from the Soap UI under raw response tab I see the following result(find attachment). Now in AOP controller I want to read this header value which is marked as red. How it is possible? Thanks in advance.

enter image description here


Solution

  • In my application to send soap requests I have WebServiceTemplate. I applied custom interceptor WebServiceInterceptor (which implements ClientInterceptor interface) on this web service template. In overridden afterCompletion method, which injects MessageContext, I was able to take this property from the SaajMessageHeader.

    Here is what code looks like:

    @Configuration
    public class MyWebServiceConfig {
        
        @Bean(name = "myWSClient")
        public WebServiceTemplate myWSClient() throws Exception {
            WebServiceTemplate template = new WebServiceTemplate();
            
            ...
    
            WebServiceInterceptor[] interceptors = { new WebServiceInterceptor() };
            template.setInterceptors(interceptors);
            return template;
        }
        
        
        private static class WebServiceInterceptor implements ClientInterceptor {
    
            @Override
            public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
                ...
                return true;
            }
    
            @Override
            public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException {
                return true;
            }
    
            @Override
            public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
                return true;
            }
    
            @Override
            public void afterCompletion(MessageContext messageContext, Exception ex) throws WebServiceClientException {
                try {
                    SaajSoapMessage message = (SaajSoapMessage) messageContext.getResponse();
    
                    String []traceId = message.getSaajMessage().getMimeHeaders().getHeader("ITRACING_TRACE_ID");
                        if(traceId != null && traceId.length > 0){
                            process.setTraceId(traceId[0]);
                        }
                } catch (Exception e) {
                }
    
            }
        
    }