Отслеживание XML-запроса / ответов с помощью JAX-WS при возникновении ошибки - PullRequest
23 голосов
/ 18 марта 2011

Я хочу регистрировать необработанные мыльные запросы, если есть какие-либо ошибки, я использую JAX-WS. Любая помощь будет оценена.

Существует ли простой способ (он же не использует прокси-сервер), чтобы получить доступ к необработанному XML-запросу / ответу для веб-службы, опубликованной с эталонной реализацией JAX-WS (включенной в JDK 1.5 и выше), только при возникновении исключения в ответ? Я хочу зарегистрировать необработанный SOAP-запрос, чтобы я мог проверить его с помощью любого клиента веб-сервиса на более позднем этапе

Ответы [ 8 ]

32 голосов
/ 13 апреля 2011

Используйте

com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true

и

com.sun.xml.internal.ws.transport.http.HttpAdapter.dump=true

вместо этого (обратите внимание на «внутренний» в имени пакета), это сделалоуловка для меня.

Ура, Торстен

27 голосов
/ 13 июня 2013

Просто подумал, что упомяну это:

Вопрос, когда использовать имя свойства с internal в нем, а когда нет?

Если вы прочитаете Metro Guide , он скажет вам использовать:

на клиенте:

com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true

на сервере:

com.sun.xml.ws.transport.http.HttpAdapter.dump=true

Однако: мне кажется, что когда библиотека JAX-WS RI была включена в стандартную комплектацию с JDK (это было с Java 6), тогда Sun пришлось переименовать имя свойства, чтобы включить в него «internal». Так что, если вы используете JAX-WS RI в комплекте с JDK, тогда вы должны обязательно добавить internal к имени свойства. В противном случае это не будет работать. Другими словами вам нужно использовать:

на клиенте:

com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true

на сервере:

com.sun.xml.internal.ws.transport.http.HttpAdapter.dump=true

С другой стороны, если вы используете автономную версию JAX-WS RI (или Metro в целом), то я думаю, вы должны использовать имя свойства без internal.

Я буду рад, если кто-то знает об этом изнутри и может сказать, правда это или нет.

4 голосов
/ 23 ноября 2011

В дополнение к ответу Торстена

com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump = истина

Убедитесь, что вы установили это перед созданием экземпляра объекта WebServiceClient (тот, который расширяет Service)

3 голосов
/ 18 марта 2011

Первое, что вы можете попробовать - использовать одно или оба из следующих системных свойств:

Клиент:

com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true

Сервер:

com.sun.xml.ws.transport.http.HttpAdapter.dump=true
2 голосов
/ 14 апреля 2015

Если вы работаете с Jboss 6.1 и хотите распечатать журналы для запроса сгенерированных классов JAX-WS к веб-службе SOAP, открыть файл /home/oracle/jboss-eap-6.1/bin/standalone.sh note : перейдите туда, где вы установили jboss

Вы найдете что-то вроде этого

JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=n"

Измените его на показанный ниже

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true -agentlib:jdwp=transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=n"

Также убедитесь, что вы включили отладку

DEBUG_MODE=true
1 голос
/ 13 марта 2019

Можно использовать системные свойства (здесь Gradle DSL для test задачи):

systemProperty "com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true"
systemProperty "com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true"
systemProperty "com.sun.xml.ws.transport.http.HttpAdapter.dump", "true"
systemProperty "com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true"
systemProperty "com.sun.xml.ws.transport.http.HttpAdapter.dumpTreshold", "99999"
systemProperty "com.sun.xml.internal.ws.transport.http.HttpAdapter.dumpTreshold", "99999"

, но эти параметры глобальные и могут иметь большой объем для включения их в PROD ...Не интересно добавлять фильтры в вашу среду ведения журнала, привязанную к бизнес-логике, если вы хотите уменьшить объем ведения журнала XML.

Подробная информация о захвате тел req / rsp в обработчиках WS содержится в моем ответе КакЯ передаю данные обратно из обработчика SOAP клиенту веб-службы?

Вот важная часть:

public class MsgLogger implements SOAPHandler<SOAPMessageContext> {

    public static String REQEST_BODY = "com.evil.request";
    public static String RESPONSE_BODY = "com.evil.response";

    @Override
    public Set<QName> getHeaders() {
        return null;
    }

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        SOAPMessage msg = context.getMessage();
        Boolean beforeRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream(32_000);
            context.getMessage().writeTo(baos);
            String key = beforeRequest ? REQEST_BODY : RESPONSE_BODY;
            context.put(key, baos.toString("UTF-8"));
            context.setScope(key, MessageContext.Scope.APPLICATION);
        } catch (SOAPException | IOException e) { }
        return true;
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        return handleMessage(context);
    }

    @Override
    public void close(MessageContext context) { }
}

Чтобы зарегистрировать обработчик и использовать сохраненные свойства:

BindingProvider provider = (BindingProvider) port;
List<Handler> handlerChain = bindingProvider.getBinding().getHandlerChain();
handlerChain.add(new MsgLogger());
bindingProvider.getBinding().setHandlerChain(handlerChain);

Req req = ...;
Rsp rsp = port.serviceCall(req); // call WS Port

// Access saved message bodies:
Map<String, Object> responseContext = provider.getResponseContext();
String reqBody = (String) responseContext.get(MsgLogger.REQEST_BODY);
String rspBody = (String) responseContext.get(MsgLogger.RESPONSE_BODY);

С этим решением (это только скелет, правильная обработка ошибок / крайние случаи - на ваше усмотрение), вы решаете войти позже, когда получите ответ.

1 голос
/ 27 октября 2014

Это сработало для меня:

-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
1 голос
/ 30 марта 2011

Я думаю, что вам нужен обработчик, см .: http://jax -ws.java.net / articles / handlers_introduction.html С помощью обработчика вы можете перехватить вызов веб-службы и получить доступ ко всем сообщениям SOAP.

...