Existe uma maneira fácil (também conhecida como: não usar um proxy) para obter acesso ao XML de solicitação / resposta bruta de um serviço da web publicado com a implementação de referência JAX-WS (a incluída no JDK 1.5 e melhor)? Ser capaz de fazer isso via código é o que eu preciso fazer. Apenas registrá-lo em um arquivo com configurações inteligentes de log seria bom, mas suficiente.
Eu sei que existem outras estruturas mais complexas e completas que podem fazer isso, mas eu gostaria de mantê-lo o mais simples possível e o eixo, o cxf, etc, acrescentam uma sobrecarga considerável que eu quero evitar.
Obrigado!
java
web-services
jax-ws
Antonio
fonte
fonte
Respostas:
As opções a seguir habilitam o log de todas as comunicações no console (tecnicamente, você só precisa de uma delas, mas isso depende das bibliotecas usadas, portanto, a configuração das quatro é a opção mais segura). Você pode configurá-lo no código como no exemplo, ou como parâmetro de linha de comando usando -D ou como variável de ambiente, como Upendra escreveu.
Consulte a pergunta Rastreando Solicitações / Respostas XML com JAX-WS quando ocorrer um erro para obter detalhes.
fonte
Aqui está a solução no código bruto (reunido graças a stjohnroe e Shamik):
Onde está SOAPLoggingHandler (extraído de exemplos vinculados):
fonte
ep.publish(publishURL);
: o que épublishURL
(No meu código, o URL de WSDL está incluída no próprio serviço; i não têm nenhum fora url O que eu sinto falta.?)Antes de iniciar o tomcat, defina
JAVA_OPTS
como abaixo nos envs do Linux. Então inicie o Tomcat. Você verá a solicitação e a resposta nocatalina.out
arquivo.fonte
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
Defina as seguintes propriedades do sistema, isso habilitará o log xml. Você pode configurá-lo em java ou arquivo de configuração.
logs do console:
fonte
Injetar
SOAPHandler
na interface do nó de extremidade. podemos rastrear a solicitação e resposta SOAPImplementando SOAPHandler com Programmatic
Declarativo incluindo
@HandlerChain(file = "handlers.xml")
anotação em sua interface do terminal.handlers.xml
SOAPLoggingHandler.java
fonte
Existem várias maneiras de fazer isso programaticamente, conforme descrito nas outras respostas, mas são mecanismos bastante invasivos. No entanto, se você souber que está usando o JAX-WS RI (também conhecido como "Metro"), poderá fazer isso no nível de configuração. Veja aqui para obter instruções sobre como fazer isso. Não há necessidade de mexer com seu aplicativo.
fonte
// Esta solução fornece uma maneira de adicionar programaticamente um manipulador ao cliente de serviços da Web sem a configuração XML
// Consulte o documento completo aqui: http://docs.oracle.com/cd/E17904_01//web.1111/e13734/handlers.htm#i222476
// Crie uma nova classe que implementa SOAPHandler
// Adicione programaticamente seu LogMessageHandler
fonte
Estou postando uma nova resposta, pois não tenho reputação suficiente para comentar a fornecida por Antonio (consulte: https://stackoverflow.com/a/1957777 ).
Caso deseje que a mensagem SOAP seja impressa em um arquivo (por exemplo, via Log4j), você pode usar:
Observe que, em determinadas circunstâncias, a chamada de método writeTo () pode não se comportar conforme o esperado (consulte: https://community.oracle.com/thread/1123104?tstart=0 ou https://www.java.net/node / 691073 ), portanto, o seguinte código fará o truque:
fonte
Você precisa implementar um javax.xml.ws.handler.LogicalHandler, esse manipulador precisa ser referenciado em um arquivo de configuração do manipulador, que por sua vez é referenciado por uma anotação @HandlerChain no terminal de serviço (interface ou implementação). Em seguida, você pode enviar a mensagem por system.out ou por um criador de logs em sua implementação processMessage.
Vejo
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
fonte
As respostas listadas aqui que o orientam a usar
SOAPHandler
estão totalmente corretas. O benefício dessa abordagem é que ela funcionará com qualquer implementação JAX-WS, pois SOAPHandler faz parte da especificação JAX-WS. No entanto, o problema com o SOAPHandler é que ele tenta implicitamente representar a mensagem XML inteira na memória. Isso pode levar a um enorme uso de memória. Várias implementações do JAX-WS incluíram suas próprias soluções alternativas para isso. Se você trabalha com solicitações ou respostas grandes, precisa analisar uma das abordagens proprietárias.Como você pergunta sobre "o incluído no JDK 1.5 ou melhor", responderei com relação ao que é formalmente conhecido como JAX-WS RI (também conhecido como Metro), que é o que está incluído no JDK.
O JAX-WS RI possui uma solução específica para isso, que é muito eficiente em termos de uso de memória.
Consulte https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . Infelizmente, esse link está quebrado agora, mas você pode encontrá-lo no WayBack Machine. Vou dar os destaques abaixo:
O pessoal do Metro em 2007 introduziu um tipo de manipulador adicional
MessageHandler<MessageHandlerContext>
, proprietário do Metro. É muito mais eficiente doSOAPHandler<SOAPMessageContext>
que não tenta fazer representação DOM na memória.Aqui está o texto crucial do artigo original do blog:
(citação final da publicação no blog de 2007)
Escusado será dizer que seu manipulador personalizado,
LoggingHandler
no exemplo, precisa ser adicionado à sua cadeia de manipuladores para ter algum efeito. É o mesmo que adicionar qualquer outroHandler
, para que você possa procurar nas outras respostas desta página como fazer isso.Você pode encontrar um exemplo completo no repositório Metro GitHub .
fonte
Você pode tentar colocar um
ServletFilter
na frente do serviço da web e inspecionar a solicitação e resposta indo / retornando do serviço.Embora você especificamente não tenha solicitado um proxy, às vezes acho que o tcptrace é suficiente para ver o que acontece em uma conexão. É uma ferramenta simples, sem instalação, mostra os fluxos de dados e também pode gravar em arquivo.
fonte
Em tempo de execução, você pode simplesmente executar
as dump é um var público definido na classe da seguinte maneira
fonte
Estou certo ao entender que você deseja alterar / acessar a mensagem XML bruta?
Nesse caso, você (ou já que tem cinco anos, o próximo cara) pode querer dar uma olhada na interface do provedor que faz parte do JAXWS. A contraparte do cliente é feita usando a classe "Dispatch". De qualquer forma, você não precisa adicionar manipuladores ou interceptores. Você ainda pode, é claro. A desvantagem é que desta forma, você é COMPLETAMENTE responsável pela criação da mensagem SOAPMessage, mas é fácil, e se é isso que você deseja (como eu queria), isso é perfeito.
Aqui está um exemplo para o lado do servidor (um pouco desajeitado, era apenas para experimentar) -
Você publica como se fosse um SEI,
Ou você pode usar uma classe Endpoint para isso. Espero que tenha sido útil.
Ah, se você quiser, não precisa lidar com cabeçalhos e outras coisas, se alterar o modo de serviço para PAYLOAD (você só obterá o corpo do sabão).
fonte
com os arquivos de configuração logback.xml, você pode:
Isso registrará a solicitação e a resposta assim (dependendo da sua configuração para a saída do log):
fonte
Eu estava tentando encontrar alguma biblioteca de estrutura para registrar a solicitação e resposta de sabão de serviço da web por alguns dias. O código abaixo corrigiu o problema para mim:
fonte
Uma maneira de fazer isso é não usar seu código, mas usar farejadores de pacotes de rede como Etheral ou WireShark, que podem capturar o pacote HTTP com a mensagem XML como carga útil e você pode continuar registrando-os em um arquivo.
Mas uma abordagem mais sofisticada é escrever seus próprios manipuladores de mensagens. Você pode dar uma olhada aqui .
fonte
Na realidade. Se você procurar nas fontes do HttpClientTransport, notará que ele também está gravando mensagens no java.util.logging.Logger. O que significa que você também pode ver essas mensagens nos seus logs.
Por exemplo, se você estiver usando o Log4J2, tudo o que você precisa fazer é o seguinte:
Após essas etapas, você começará a ver mensagens SOAP em seus logs.
fonte
Existem algumas respostas usando SoapHandlers neste tópico. Você deve saber que o SoapHandlers modifica a mensagem se
writeTo(out)
for chamada.Chamar o
writeTo(out)
método de SOAPMessage chama automaticamente osaveChanges()
método também. Como resultado, todos os dados binários MTOM / XOP anexados em uma mensagem são perdidos.Não sei por que isso está acontecendo, mas parece ser um recurso documentado.
https://docs.oracle.com/javase/7/docs/api/javax/xml/soap/SOAPMessage.html#saveChanges ()
fonte
Se você executar um servidor de aplicativos IBM Liberty, basta adicionar ibm-ws-bnd.xml no diretório WEB-INF.
fonte