[JAVA] Protokollausgabe der WebServiceTemplate-Anforderung / Antwort

Überblick

Ich möchte die Ausführung der Web-API anhand der vom Spring-Framework bereitgestellten Webdienstvorlage protokollieren.

Umgebung

Fügen Sie "ClientInterceptor" in "WebServiceTemplate" ein

--Verwenden Sie einen Interceptor, der auf die Anforderung / Antwort von "WebServiceTemplate" verweist

Interceptor, der Protokolle ausgibt

WebServiceTemplate-Interceptor


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());
        }
    }

}

Bean-Definition von WebServiceTemplate

--Bean Definition von WebServiceTemplate mit einem Interceptor, der Protokolle ausgibt.

@Configuration
public class ExternalApiConfig {

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

}

Referenz

Spring WS - Log Client Server HTTP Headers Example

Recommended Posts

Protokollausgabe der WebServiceTemplate-Anforderung / Antwort
Anforderungs- und Antwortprotokolle mit Spring Boot ausgeben
Melden Sie die Anforderung / Antwort von RestTemplate ab
Geben Sie den HTTP-Header des zu protokollierenden Google-http-Clients aus
[Apache Camel] Einfacher Durchsatz in einem Protokoll ausgeben
Beispiel für die Ausgabe eines Parameterprotokollprotokolls Java & Spring MVC
Informationen zur Java-Protokollausgabe
Format der Protokollausgabe von Tomcat selbst in Tomcat 8
Ausgabe in Vielfachen von 3
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
Steuerprotokollausgabe mit Doma2
Beispiel für eine Java-Standardprotokollausgabe