0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WebServiceTemplateのリクエスト・レスポンスをログ出力する

Posted at

概要

Springフレームワークで提供されているWebServiceTemplateによるWebAPIの実行をログ出力したい。

環境

  • Java 8
  • SpringBoot 2.1.3.RELEASE
  • Spring 5.1.5.RELEASE
  • Lombok 1.18.6

WebServiceTemplateClientInterceptorを差し込む

  • WebServiceTemplateのリクエスト・レスポンスを参照するインターセプタを利用する
    • 送受されるHTTPヘッダ・ボディをログで出力

ログ出力を行うインターセプタ

WebServiceTemplateのインターセプタ
import lombok.Getter;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.ws.client.WebServiceClientException;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.transport.TransportOutputStream;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;

@Slf4j
public class WebServiceTemplateLoggingInterceptor implements ClientInterceptor {

    private final ThreadLocal<UUID> requestUuid = new ThreadLocal<>();

    @SneakyThrows
    @Override
    public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
        if (log.isInfoEnabled()) {
            requestUuid.set(UUID.randomUUID());
            val transportOutputStream = new ByteArrayTransportOutputStream();
            messageContext.getRequest().writeTo(transportOutputStream);
            log.info("[SOAP:Request({})] Headers=[{}], Body=[{}]",
                requestUuid.get(),
                transportOutputStream.getHeaders(),
                transportOutputStream.getBody()
            );
        }
        return true;
    }

    @SneakyThrows
    @Override
    public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException {
        if (log.isInfoEnabled()) {
            val transportOutputStream = new ByteArrayTransportOutputStream();
            messageContext.getResponse().writeTo(transportOutputStream);
            log.info("[SOAP:Response({})] Headers=[{}], Body=[{}]",
                requestUuid.get(),
                transportOutputStream.getHeaders(),
                transportOutputStream.getBody()
            );
        }
        return true;
    }

    @Override
    public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
        return true;
    }

    @Override
    public void afterCompletion(MessageContext messageContext, Exception ex) throws WebServiceClientException {
    }

    private static class ByteArrayTransportOutputStream extends TransportOutputStream {
        private final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        @Getter
        private final MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();

        @Override
        public void addHeader(String name, String value) throws IOException {
            headers.add(name, value);
        }

        @Override
        protected OutputStream createOutputStream() throws IOException {
            return byteArrayOutputStream;
        }

        public String getBody() {
            return new String(byteArrayOutputStream.toByteArray());
        }
    }

}

WebServiceTemplateのBean定義

  • ログ出力を行うインターセプタを設定したWebServiceTemplateをBean定義する。
@Configuration
public class ExternalApiConfig {

    @Bean
    WebServiceTemplate webServiceTemplate() {
        return new WebServiceTemplateBuilder()
            .additionalInterceptors(new WebServiceTemplateLoggingInterceptor())
            .build();
    }

}

参考

Spring WS - Log Client Server HTTP Headers Example

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?