4

我有一个使用 Axis2 生成的 SOAP 客户端。它使用 JAXB-RI,尽管这可能无关紧要。

我没有任何 XML 配置。只需获取Stub生成的wsdl2java,准备响应(作为 POJO)并在Stub.

如何获取在此调用中交换的请求和响应的原始 XML(作为字符串)?

我想通了service._getServiceClient().getLastOperationContext().getMessageContext("Out").getEnvelope()(和类似的"In"),但其中一个抛出异常,因为流已经被处理。

这听起来很明显,但不知何故我不知道该怎么做,而且官方文档非常稀缺。

4

2 回答 2

1

不确定“In”消息标签有什么问题,

但是在搜索时,发现以下 JIRA 票 https://issues.apache.org/jira/browse/AXIS2-5469 指向 https://issues.apache.org/jira/browse/AXIS2-5202 并在讨论中找到了一个的 WA 使用以下代码解决此问题,我能够收听肥皂请求的响应消息。

 stub._getServiceClient().getAxisService().addMessageContextListener(
 new MessageContextListener() {
        public void attachServiceContextEvent(ServiceContext sc,
            MessageContext mc) {}
        public void attachEnvelopeEvent(MessageContext mc) {
            try
            { mc.getEnvelope().cloneOMElement().serialize(System.out); }
            catch (XMLStreamException e) {}
        }
  });
于 2015-04-19T19:26:55.727 回答
1

我遇到了类似的问题,你可以参考下面的代码

private void ResponseSOAPMessage(OperationContext opCtx, OMElement responseOM)
        throws AxisFault
      {
        MessageContext msgCtxIn = opCtx.getMessageContext("In");
        if (!msgCtxIn.getEnvelope().isComplete())
        {
          msgCtxIn.getEnvelope().getBody().getFirstOMChild().close(false);
          msgCtxIn.getEnvelope().getBody().addChild(responseOM);
          msgCtxIn.getEnvelope().getBody().getFirstOMChild().detach();
        }
        CommonsTransportHeaders inHeaders = (CommonsTransportHeaders)msgCtxIn.getProperty("TRANSPORT_HEADERS");
        if (msgCtxIn.getEnvelope().isComplete())
        {
           System.out.println("SOAP Response:");
           System.out.println(msgCtxIn.getEnvelope().toString());
        }
        else
        {
           System.out.println("SOAP Response Message Body:");
           System.out.println(responseOM.toString());
        }
      }
于 2016-07-13T19:51:23.577 回答