Hi Kathy,

Just a small extension to my previous mail:

1. In AuditOutInterceptorEnding. handleMessage() you can access SOAPMessage 
using following code:
     SOAPMessage soapMessage = message.getContent(SOAPMessage.class);
     SOAPBody body = soapMessage.getSOAPBody();
     ...

2. If you don't want to build DOM model and like to work with stream message, 
the only way to do it is wrap OutputStream or XMLStreamWritter message content 
with own implementation, replace it in the message and access body/header from 
your  wrapper.

Regards,
Andrei.

-----Original Message-----
From: Andrei Shakirin [mailto:[email protected]] 
Sent: Donnerstag, 4. Oktober 2012 11:20
To: [email protected]
Subject: RE: Need XML when intercepting an outbound SOAP message

Hi Kathy,

If you are working with DOM messages, you can use the similar technic as in CXF 
security interceptors (WSS4JOutInterceptor):

public class AuditOutInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

        private final SAAJOutInterceptor saajOut = new SAAJOutInterceptor();
        private final AuditOutInterceptorEnding ending;

        public AuditOutInterceptor() {
                super(Phase.PRE_PROTOCOL);
                addAfter(SAAJOutInterceptor.class.getName());
                ending = new AuditOutInterceptorEnding();
        }

        @Override
        public void handleMessage(SoapMessage message) {
                if (null == message.getContent(SOAPMessage.class)) {
                        saajOut.handleMessage(message);
                }
                message.getInterceptorChain().add(ending);
        }

        public final static class AuditOutInterceptorEnding extends 
AbstractPhaseInterceptor<SoapMessage> {

                public AuditOutInterceptorEnding() {
                        super(Phase.POST_PROTOCOL);
                }

                @Override
                public void handleMessage(SoapMessage message) throws Fault {
                        // Access SOAP header and SOAP body here
                        }
           }
}


Regards,
Andrei.

-----Original Message-----
From: kstone [mailto:[email protected]] 
Sent: Mittwoch, 3. Oktober 2012 23:40
To: [email protected]
Subject: Need XML when intercepting an outbound SOAP message

All,
I am having the same issue as outlined in  this past post 
<http://www.mail-archive.com/[email protected]/msg13642.html>
I tried all of the suggestions there to no avail.

Our goal is to grab the outgoing xml from the SoapMessage and log to database 
for auditing purposes.
When I call getContent on the message, it is null. I have tried all phases 
listed below.
We have this working okay on the server side just not outgoing client 
Interceptor.

We are using JDK 1.6 under Grails/Groovy and grails cxf-client plugin

Could you please advise?
Thanks in advance!
Kathy

class ClientOutputMessageInterceptor extends AbstractSoapInterceptor {

    private SAAJOutInterceptor saajOut = new SAAJOutInterceptor()

    ClientOutputMessageInterceptor()
    {
        //http://www.mail-archive.com/[email protected]/msg13642.html,
should be after SAAJOutEndingInterceptor but before BareOutInterceptor
        // super(Phase.PRE_STREAM)//this phase had empty soap-env:header and 
soap-env:body elements

        super(Phase.PRE_PROTOCOL)//this phase had empty soap-env:header and 
soap-env:body elements

        //super(Phase.WRITE);//this phase had empty soap-env:header and 
soap-env:body elements
        //super(Phase.POST_PROTOCOL)//this phase had empty soap-env:header and 
soap-env:body elements
        //super(Phase.POST_STREAM)//this phase had empty soap-env:header and 
soap-env:body elements
        //super(Phase.SEND)//this phase had empty soap-env:header and 
soap-env:body elements
        //super(Phase.SETUP_ENDING)//this phase had empty soap-env:header and 
soap-env:body elements

        //addAfter(BareOutInterceptor.class.getName());
        addAfter().add(new SAAJOutInterceptor());
    }

    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        System.out.println(message.getInterceptorChain())
        SOAPMessage soapMessage = message.getContent(SOAPMessage.class);

        if (soapMessage == null) {
            saajOut.handleMessage(message);
            soapMessage = message.getContent(SOAPMessage.class);
        }

        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            soapMessage.writeTo(baos);
            //baos has empty body

        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    private SOAPMessage getSOAPMessage(SoapMessage smsg){

        SOAPMessage soapMessage =  smsg.getContent(SOAPMessage.class);
        if (soapMessage == null) {

             saajOut.handleMessage(smsg);
             soapMessage =  smsg.getContent(SOAPMessage.class);
        }

         return soapMessage;
       }
}


More info:
This is the PhaseInterceptorChain I see output. I do not see the 
SAAJOutInterceptor here at all.
I have also implemented a CustomLoggingOutInterceptor similar to the one 
here <https://github.com/ctoestreich/cxf-client#Out>   and this also is null
when calling getContent on the message. However, the CustomOutLogging 
Interceptor falls after [BareOutInterceptor] but before 
SAAJOutEndingInterceptor and still not able to grab XML.

  setup [PolicyOutInterceptor]
  pre-logical [HolderOutInterceptor, SwAOutInterceptor, 
WrapperClassOutInterceptor, SoapHeaderOutFilterInterceptor]
  post-logical [SoapPreProtocolOutInterceptor]
  prepare-send [MessageSenderInterceptor]
  pre-stream [LoggingOutInterceptor, AttachmentOutInterceptor, 
StaxOutInterceptor]
  pre-protocol [LmmClientOutputMessageInterceptor]
  write [SoapOutInterceptor]
  marshal [BareOutInterceptor]
  send [CustomLoggingOutInterceptor]
  pre-stream-ending [StaxOutEndingInterceptor]
  prepare-send-ending [MessageSenderEndingInterceptor]



--
View this message in context: 
http://cxf.547215.n5.nabble.com/Need-XML-when-intercepting-an-outbound-SOAP-message-tp5715588.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to