Getting raw XML SOAP-response on client side using ADB-stubs created by AXIS2

前端 未结 5 1787
天涯浪人
天涯浪人 2021-01-04 21:30

I access a SOAP service using ADB-stubs created by AXIS2. I would like to log the raw XML response of any Axis Fault, that is returned by the service. I can catch those erro

5条回答
  •  梦谈多话
    2021-01-04 22:23

    For Axis2, those who do not have luxury of changing implementation/ or do not want to use JAS-WS for xyz reasons,

    Found @Ducane's useful

    request = >yourStub._getServiceClient().getLastOperationContext().getMessageContext("Out")
             .getEnvelope().toString());
    
    response = >yourStub._getServiceClient().getLastOperationContext().getMessageContext("In")
             .getEnvelope().toString());
    

    As suggested in @dayer's answer

    response = >yourStub._getServiceClient().getLastOperationContext().getMessageContext("In")
         .getEnvelope().toString());
    

    fails with a com.ctc.wstx.exc.WstxIOException exception and the message: >Attempted read on closed stream.

    Not sure what is issue with "In" Message Lable,

    But while searching, found following JIRA ticket https://issues.apache.org/jira/browse/AXIS2-5469 which points to https://issues.apache.org/jira/browse/AXIS2-5202 And in discussion found one of the WA to solve this issue using following code, I am able to listen Response message for the soapRequest.

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

    As here MessageContextListner is Argument-Defined Anonymous Inner Classes it will have access to all enclosing variables, So i just defined a string class variable as latestSoapResponse and stored response for further use.

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    mc.getEnvelope().cloneOMElement().serialize(baos); 
    latestSoapResponse=baos.toString();
    

    Note that you need to add listener before generating soap request. and Request MessageContext will only be available once you generate soap request.

    Also those who are just want raw soap request response for debugging purpose may see answer from @Sanker, here to enable Apache commons logging using JVM arguments.

提交回复
热议问题