Отслеживание запроса XML / Ответы с JAX-WS при возникновении ошибки -- java поле с участием jax-ws пол Связанный проблема

Tracing XML request/responses with JAX-WS when error occurs


27
vote

проблема

русский

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

Есть просто простым способом (ака: не используя прокси), чтобы получить доступ к доступу к XML Access Cover Coving / Rescounts для веб-сайта, опубликованного JAX-WS справочной реализации (тот, который включен в JDK 1.5 и лучше) только тогда, когда происходит исключение в ответ? Я хочу возобновить Rear SOAM Reuest, чтобы я мог проверить его Chorage Webservice на более позднем этапе

Английский оригинал

I want to log raw soap post requests if there are any errors , I am using JAX-WS. Any help will be appreciated.

Is there an easy way (aka: not using a proxy) to get access to the raw request/response XML for a webservice published with JAX-WS reference implementation (the one included in JDK 1.5 and better) only when exception occurs in response? I want to log raw SOAP reuest so that I can test it thorugh any webservice client at a later stage

</div
     

Список ответов

33
 
vote

Использование

<Код> com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true

и

<Код> com.sun.xml.internal.ws.transport.http.HttpAdapter.dump=true

Вместо этого

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

ура, Торстин

 

Use

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

and

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

instead (note the "internal" in the package name), this did the trick for me.

Cheers, Torsten

</div
 
 
     
     
28
 
vote

Просто думал, что я бы сказал это:

Вопрос, когда использовать имя свойства с 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), то Солнцем пришлось переименовать имя свойства, чтобы включить «внутреннее». Так что, если вы используете 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 (или метро в целом), то я думаю, что вы должны использовать имя свойства без <код> internal .

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

 

Just thought I would mention this:

The question when to use the property name with the internal in it and when not ?

If you read the Metro Guide it will tell you to use:

on client:

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

on server:

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

However: It seems to me that when JAX-WS RI library got included as standard with the JDK (this was with Java 6) then Sun had to rename the property name to include 'internal'. So if you are using JAX-WS RI as it comes bundled with the JDK, then you must be sure to add the internal to the property name. Otherwise it will not work. In other words you need to use:

on client:

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

on server:

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

On the other hand if you are using a standalone version of JAX-WS RI (or of Metro as a whole) then I would guess you should use the property name without the internal.

I'll be glad if someone has inside knowledge on this and can say if this is true or not.

</div
 
 
5
 
vote

Это нормально, чтобы пойти с системными свойствами (вот Gradle DSL для <код> test Task):

 <код> 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 в Webservice Client?

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

 <код> 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) { } }   

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

 <код> com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true 0  

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

 

It is OK to go with system properties (here is Gradle DSL for test task):

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" 

but those settings are global and may have high volume to enable them on PROD... It is not fun to add filters to your logging framework bound to business logic if you want to reduce volume of XML logging.

Details on capturing req/rsp bodies in WS handlers are in my answer How can I pass data back from a SOAP handler to a webservice client?

Here is an important part:

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) { } } 

To register handler and use preserved properties:

BindingProvider provider = (BindingProvider) port; List<Handler> handlerChain = provider.getBinding().getHandlerChain(); handlerChain.add(new MsgLogger()); provider.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); 

With this solution (it is only the skeleton, proper error handling / edge cases is up to you) you decide to log later when you've got response.

</div
 
 
 
 
4
 
vote

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

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

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

 

In addition to Torsten's answer

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

Make sure that you set this before instantiating the WebServiceClient object (the one that extends Service)

</div
 
 
3
 
vote

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

клиент:

 <код> com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true 1  

Сервер:

 <код> com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true 2  
 

The first thing you might want to try is using one, or both, of the following system properties:

Client:

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

Server:

com.sun.xml.ws.transport.http.HttpAdapter.dump=true 
</div
 
 
         
         
2
 
vote

Если вы работаете с jboss 6.1, и вы хотите распечатать журналы для запроса классов Jax-WS WS к веб-сервису SOAP, Откройте файл <код> com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true 3 Примечание : Пожалуйста, пойдите, где вы установили JBoss

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

 <код> com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true 4  

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

 <код> com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true 5  

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

 <код> com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true 6  
 

If you working with Jboss 6.1 and you want to print the logs for the JAX-WS generated classes request to the SOAP web service, open the file /home/oracle/jboss-eap-6.1/bin/standalone.sh note: please go where you have installed jboss

You will find something like this

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

Change it to the one shown below

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" 

Also make sure you enable debug

DEBUG_MODE=true 
</div
 
 
1
 
vote

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

 

I think that what you need is an handler, see: http://jax-ws.java.net/articles/handlers_introduction.html
With handler you can intercept web service call, and have access to all the SOAP message.

</div
 
 
1
 
vote

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

 <код> -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true   
 

This worked for me:

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

Связанный проблема

-1  Нужно упростить логическое выражение (байт, короткое, целое число) Java  ( Need to simplify logical expression byte short integer java ) 
Мне нужно упростить выражение Первое выражение <код> (byte)( (short)((short)( (byte)((theInt >> 8) & 0xFF) & 0xFF) + 128) & 0xFF); второе выражение ...

17  Перегрузка Java VS переопределения  ( Java overloading vs overriding ) 
Привет, я просто хочу убедиться, что у меня есть эти понятия правильно. Перегрузка в Java означает, что у вас может быть конструктор или метод с различным кол...

0  Android Studio Back Button  ( Android studio back button problems ) 
на данный момент. Я создал простое приложение для викторины на Android Studio. Все работает нормально, в том числе, когда я иду от первой фактической жизни. Я...

1  Apache Vamel: Как проверить, например, набор набора <customObject>  ( Apache camel how to test for instance of setcustomobject ) 
Кто-нибудь знает, как тестировать для различных типов коллекции в маршруте? <код> // This processor returns a Collection of 2 Sets // 1. Set<GoodMessage> //...

1  Реализация интерфейса Realmmodel при расширении другого объекта  ( Implementing realmmodel interface while extending another object ) 
Я хочу использовать новую функцию realm-java, где я могу просто реализовать интерфейс Realmmodel и добавить аннотацию @realmclass для определения таблицы. Все...

22  Множественные методы постконструкции?  ( Multiple postconstruct methods ) 
Он говорит в Документация Java для Postconstruct что Только один метод может быть аннотирован с этой аннотацией Но я просто пытался аннотировать три м...

3  Eclipse Java Formatter - новая линия до закрытия скобок  ( Eclipse java formatter newline before closing parentheses ) 
Можно ли настроить Dippleter Eclipse Java для вставки новой строки до закрытия скобок выражений, деклараций метода и вызовы методов? Обратите внимание на же...

0  Должен ли я использовать Mac для разработки Javafx для iOS  ( Do i have to use a mac to develop javafx for ios ) 
Документация http://docs.gluonhq.com/charm/4.0.1 / # _ iOS говорит, что мне нужно «Mac с MacOS X 10.9 или превосходящим» для разработки для iOS. Но я не пон...

0  Как повторять первые столбцы, затем строки для чтения листа Excel в Java  ( How to iterate first columns then rows to read excel sheet in java ) 
Я хочу прочитать лист Excel так что я хочу прочитать мои данные 1-го столбца и повторять все строки, затем 2-й столбец Так как это сделать. Я сначала попроб...

0  Как удалить нынешние barchart (jfreechart), отображаемый и отображаю новый Barchart в том же представлении плагина Eclipse RCP?  ( How to delete the present barchartjfreechart displayed and display new barchar ) 
Я создаю Barchart с видом на плагин RCP. Данные, которые будут отображаться на графике, поставляется из файла базы данных SQLite3. Код, который я написал, ото...

0  Класс libgdx не рисует текстуру  ( Libgdx class does not draw texture ) 
Я пытаюсь нарисовать игровой символ в моем классе "MaigaMestreen.java" из класса "Mavans.java", когда я касаюсь экрана моего телефона. К сожалению, моя прогр...

60  Получение ConcurrentModificationException брошенного при удалении элемента из списка java.util.List во время итерации? [Дубликат]  ( Getting a concurrentmodificationexception thrown when removing an element from a ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

21  Тип несоответствия для генеральных классов  ( Type mismatch for class generics ) 
У меня есть следующий код, который не скомпировался, и хотя есть способ сделать его компиляцией, я хочу понять, почему он не компилирует. Может ли кто-нибудь ...

3  Как мне изменить ответ на запрос на параметры http в приложении Spring MVC 2.5?  ( How do i change the response for a http options request in a spring mvc 2 5 appl ) 
Это звучит как тривиальный вопрос, но каким-то образом я не могу понять это. У меня есть приложение Spring MVC. Я не поддерживаю никаких HTTP-методов, кроме...

5  Конвенции о ведении регистрации [Закрыто]  ( Logging conventions ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

Связанный проблема

-1  Нужно упростить логическое выражение (байт, короткое, целое число) Java 
17  Перегрузка Java VS переопределения 
0  Android Studio Back Button 
1  Apache Vamel: Как проверить, например, набор набора <customObject> 
1  Реализация интерфейса Realmmodel при расширении другого объекта 
22  Множественные методы постконструкции? 
3  Eclipse Java Formatter - новая линия до закрытия скобок 
0  Должен ли я использовать Mac для разработки Javafx для iOS 
0  Как повторять первые столбцы, затем строки для чтения листа Excel в Java 
0  Как удалить нынешние barchart (jfreechart), отображаемый и отображаю новый Barchart в том же представлении плагина Eclipse RCP? 
0  Класс libgdx не рисует текстуру 
60  Получение ConcurrentModificationException брошенного при удалении элемента из списка java.util.List во время итерации? [Дубликат] 
21  Тип несоответствия для генеральных классов 
3  Как мне изменить ответ на запрос на параметры http в приложении Spring MVC 2.5? 
5  Конвенции о ведении регистрации [Закрыто]