Protokolliere jax-ws http Anfrage und Antwort

Ich muss die vollständige http-Anforderung und -Antwort in einem JAX-WS-WebService-Aufruf protokollieren. Für die Anfrage benötige ich die Anforderungsheader und den Body und für die Antwort die Antwortheader und den Body.

Nach einigen Recherchen habe ich festgestellt, dass ich diese Informationen mit der Eigenschaft erhalten kann:

-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true

und zeigen Sie die Informationen, die ich brauche, aber es gibt es an die Konsole und ich muss es in der Datenbank mit einer internen Anforderungs-ID speichern.

Ich habe versucht, einen Handler zu implementieren:

public class LoggingHandler implements SOAPHandler<SOAPMessageContext> {

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (outbound) {
            System.out.println("SOAP outbound!!!!!");
            Map<String, List<String>> responseHeaders = (Map<String, List<String>>) context
                    .get(SOAPMessageContext.HTTP_RESPONSE_HEADERS);
            try {
                String headers = getHeaders(responseHeaders);
                System.out.println(headers);
                String body = getBody(context.getMessage());
                System.out.println(body);
            } catch (Exception ex) {
                // TODO: What do I have to do in this case?
            }
        } else {
            System.out.println("SOAP inbound!!!!!");
            Map<String, List<String>> requestHeaders = (Map<String, List<String>>) context
                    .get(SOAPMessageContext.HTTP_REQUEST_HEADERS);
            try {
                String headers = getHeaders(requestHeaders);
                System.out.println(headers);
                String body = getBody(context.getMessage());
                System.out.println(body);
            } catch (Exception ex) {
                // TODO: What do I have to do in this case?
            }
        }
        return true;
    }

    private String getBody(SOAPMessage message) throws SOAPException, IOException {
        OutputStream stream = new ByteArrayOutputStream();
        message.writeTo(stream);
        return stream.toString();
    }

    public String getFullHttpRequest(HttpServletRequest request) throws IOException {
        InputStream in = request.getInputStream();
        String encoding = request.getCharacterEncoding();
        encoding = encoding == null ? "UTF-8" : encoding;
        String body = IOUtils.toString(in, encoding);
        return body;
    }

    private String getHeaders(Map<String, List<String>> headers) throws IOException {
        StringBuffer result = new StringBuffer();
        if (headers != null) {
            for (Entry<String, List<String>> header : headers.entrySet()) {
                if (header.getValue().isEmpty()) {
                    // I don't think this is legal, but let's just dump it,
                    // as the point of the dump is to uncover problems.
                    result.append(header.getValue());
                } else {
                    for (String value : header.getValue()) {
                        result.append(header.getKey() + ": " + value);
                    }
                }
                result.append("\n");
            }
        }
        return result.toString();
    }

}

In diesem Fall kann ich die HTTP-Anforderungsheader und den Text abrufen. In der Antwort wird jedoch nur der Text abgerufen. Die HTTP-Antwortheader sind immer leer.

Irgendeine Idee, wie man das schafft? Ziel ist es, die vollständige http-Anfrage und Antwort in einer Datenbank speichern zu können.

Vielen Dank!!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage