Существует ли простой способ (он же не использует прокси-сервер) для получения доступа к необработанному XML-запросу / ответу для веб-службы, опубликованной с эталонной реализацией JAX-WS (той, которая включена в JDK 1.5 и выше)? Я должен делать это с помощью кода. Просто записать его в файл с помощью умных конфигураций регистрации было бы неплохо, но достаточно.
Я знаю, что существуют другие более сложные и полные фреймворки, которые могут это сделать, но я бы хотел, чтобы это было как можно проще, а оси, cxf и т. Д. Все добавляли значительные накладные расходы, которых я хочу избежать.
Спасибо!
java
web-services
jax-ws
Антонио
источник
источник
Ответы:
Следующие опции позволяют регистрировать все соединения с консолью (технически вам нужен только один из них, но это зависит от библиотек, которые вы используете, поэтому установка всех четырех параметров безопаснее). Вы можете установить его в коде, как в примере, или как параметр командной строки, используя -D или как переменную окружения, как написал Upendra.
Подробности см. В вопросе « Отслеживание XML-запроса / ответов с помощью JAX-WS» при возникновении ошибки .
источник
Вот решение в необработанном коде (собранное благодаря stjohnroe и Shamik):
Где SOAPLoggingHandler (извлечено из связанных примеров):
источник
ep.publish(publishURL);
: что естьpublishURL
(В моем коде URL-адрес wsdl включен в сам сервис; у меня нет URL-Перед запуском tomcat, установите
JAVA_OPTS
как указано ниже в Linux envs. Затем запустите Tomcat. Вы увидите запрос и ответ вcatalina.out
файле.источник
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
Установите следующие системные свойства, это включит ведение журнала xml. Вы можете установить его в Java или файл конфигурации.
журналы консоли:
источник
Внедрить
SOAPHandler
в интерфейс конечной точки. мы можем проследить SOAP-запрос и ответРеализация SOAPHandler с программным
Декларативный , добавив
@HandlerChain(file = "handlers.xml")
аннотацию к интерфейсу вашей конечной точки.handlers.xml
SOAPLoggingHandler.java
источник
Существуют различные способы сделать это программно, как описано в других ответах, но это довольно инвазивные механизмы. Однако, если вы знаете, что используете JAX-WS RI (он же Metro), вы можете сделать это на уровне конфигурации. Смотрите здесь для получения инструкций о том, как это сделать. Нет необходимости возиться с вашим приложением.
источник
// Это решение предоставляет способ программного добавления обработчика для клиента веб-службы без XML-конфигурации.
// Смотрите полный документ здесь: http://docs.oracle.com/cd/E17904_01//web.1111/e13734/handlers.htm#i222476
// Создать новый класс, который реализует SOAPHandler
// Программно добавляем ваш LogMessageHandler
источник
Я публикую новый ответ, поскольку у меня недостаточно репутации, чтобы комментировать ответ, предоставленный Антонио (см. Https://stackoverflow.com/a/1957777 ).
Если вы хотите, чтобы сообщение SOAP было напечатано в файле (например, через Log4j), вы можете использовать:
Обратите внимание, что при определенных обстоятельствах вызов метода writeTo () может работать не так, как ожидается (см .: https://community.oracle.com/thread/1123104?tstart=0 или https://www.java.net/node. / 691073 ), поэтому следующий код поможет:
источник
Вам необходимо реализовать javax.xml.ws.handler.LogicalHandler, затем на этот обработчик нужно ссылаться в файле конфигурации обработчика, на который, в свою очередь, ссылается аннотация @HandlerChain в вашей конечной точке службы (интерфейсе или реализации). Затем вы можете либо вывести сообщение через system.out, либо через регистратор в вашей реализации processMessage.
Видеть
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/twbs_jaxwshandler.html
http://java.sun.com/mailers/techtips/enterprise/2006/TechTips_June06.html
источник
Ответы, перечисленные здесь, которые направляют вас использовать
SOAPHandler
являются полностью правильными. Преимущество такого подхода заключается в том, что он будет работать с любой реализацией JAX-WS, поскольку SOAPHandler является частью спецификации JAX-WS. Однако проблема с SOAPHandler заключается в том, что он неявно пытается представить все сообщение XML в памяти. Это может привести к огромному использованию памяти. Различные реализации JAX-WS добавили свои обходные пути для этого. Если вы работаете с большими запросами или большими ответами, то вам нужно рассмотреть один из проприетарных подходов.Поскольку вы спрашиваете о том, «который включен в JDK 1.5 или выше», я отвечу относительно того, что формально известно как JAX-WS RI (он же Metro), что входит в состав JDK.
JAX-WS RI имеет специальное решение для этого, которое очень эффективно с точки зрения использования памяти.
См. Https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . К сожалению, эта ссылка теперь не работает, но вы можете найти ее на WayBack Machine. Я дам основные моменты ниже:
В 2007 году сотрудники Metro представили дополнительный тип обработчиков
MessageHandler<MessageHandlerContext>
, который является собственностью Metro. Это гораздо эффективнее, чемSOAPHandler<SOAPMessageContext>
попытка сделать представление DOM в памяти.Вот ключевой текст из оригинальной статьи в блоге:
(конец цитаты из сообщения в блоге 2007 года)
Само собой разумеется, что ваш пользовательский обработчик,
LoggingHandler
в этом примере, должен быть добавлен в цепочку обработчиков, чтобы иметь какой-либо эффект. Это то же самое, что добавить любой другойHandler
, так что вы можете посмотреть в других ответах на этой странице, как это сделать.Вы можете найти полный пример в репозитории Metro GitHub .
источник
Вы можете попытаться поставить
ServletFilter
перед веб-сервисом и проверить запрос и ответ, идущий к / возвращенный из сервиса.Хотя вы специально не запрашивали прокси, иногда мне кажется, что tcptrace достаточно, чтобы посмотреть, что происходит в соединении. Это простой инструмент, без установки, он показывает потоки данных и может записывать в файл тоже.
источник
Во время выполнения вы можете просто выполнить
поскольку dump - это публичная переменная, определенная в классе следующим образом
источник
Правильно ли я понимаю, что вы хотите изменить / получить доступ к необработанному XML-сообщению?
Если это так, вы (или так как это пять лет, следующий парень), возможно, захотите взглянуть на интерфейс провайдера, который является частью JAXWS. Клиентский аналог выполняется с помощью класса «Dispatch». В любом случае вам не нужно добавлять обработчики или перехватчики. Вы все еще можете, конечно. Недостатком является то, что вы несете полную ответственность за создание SOAPMessage, но это легко, и если это то, что вы хотите (как я сделал), это прекрасно.
Вот пример для серверной части (немного неуклюже, это было только для экспериментов) -
Вы публикуете это как SEI,
Или вы можете использовать класс Endpoint для этого. Надеюсь, это было полезно.
И, если вы хотите, вам не нужно разбираться с заголовками и прочим, если вы измените режим обслуживания на PAYLOAD (вы получите только Soap Body).
источник
с конфигурационными файлами logback.xml вы можете сделать:
Это будет регистрировать запрос и ответ следующим образом (в зависимости от вашей конфигурации для вывода журнала):
источник
Я пытался найти какую-то библиотеку фреймворков для регистрации запроса и ответа мыла веб-службы в течение пары дней. Код ниже исправил проблему для меня:
источник
Один из способов сделать это - не использовать свой код, а использовать анализаторы сетевых пакетов, такие как Etheral или WireShark, которые могут перехватывать HTTP-пакет с помощью сообщения XML в качестве полезной нагрузки, и вы можете продолжать записывать их в файл или около того.
Но более сложный подход заключается в написании ваших собственных обработчиков сообщений. Вы можете посмотреть на это здесь .
источник
Фактически. Если вы посмотрите на источники HttpClientTransport, вы заметите, что он также пишет сообщения в java.util.logging.Logger. Это означает, что вы можете видеть эти сообщения в своих журналах тоже.
Например, если вы используете Log4J2, все, что вам нужно сделать, это следующее:
После этих шагов вы начинаете видеть сообщения SOAP в ваших журналах.
источник
В этой теме есть несколько ответов с использованием SoapHandlers. Вы должны знать, что SoapHandlers изменяют сообщение, если оно
writeTo(out)
вызывается.Вызов
writeTo(out)
метода SOAPMessage также автоматически вызываетsaveChanges()
метод. В результате все вложенные двоичные данные MTOM / XOP в сообщении теряются.Я не уверен, почему это происходит, но это похоже на документированную функцию.
https://docs.oracle.com/javase/7/docs/api/javax/xml/soap/SOAPMessage.html#saveChanges ()
источник
Если вы запустили сервер приложений IBM Liberty, просто добавьте ibm-ws-bnd.xml в каталог WEB-INF.
источник