Hi. Hope someone can help.

I am using CXF running on Tomcat for a number of web services. I am trying
to write an Interceptor that will capture all incoming web service requests,
extract the whole SOAP envelope (including body) as a String and write it to
a log file. I thought this would be relatively easy but I haven't been able
to get it working. I am unable to extract the SOAP envelope from the
request. I have searched on this and other forums (fora?) and have found a
couple of similar posts but none of the proposed solutions have worked for
me. My latest attempt is below. Everytime I send a request to the server the
interceptor is being called but the OutputStream is always null (LINE 2). I
have tried each of these phases in LINE 1:

RECEIVE, PRE_STREAM, USER_STREAM, POST_STREAM, READ, PRE_PROTOCOL,
USER_PROTOCOL, POST_PROTOCOL, UNMARSHAL, PRE_LOGICAL, USER_LOGICAL,
POST_LOGICAL, PRE_INVOKE, INVOKE, POST_INVOKE

but LINE 2 is hit each time.

Has anyone done this before? I would have thought it was relatively
straight-forward but maybe not. My knowledge of the nuts and bolts of CXF
isn't the best - I'm not clear why Streams are being used here. I'd
appreciate any help, thanks.

=============
build.xml (extract):
=============
<bean id="myInterceptor2" class="com.mycomp.MyInterceptor2" />

<bean id="cxf" class="org.apache.cxf.bus.CXFBusImpl">
        <property name="inInterceptors">
                <list>
                        <ref bean="myInterceptor2" />
                </list>
        </property>
</bean>

===============
MyInterceptor2 class
===============

package com.mycomp;

import java.io.OutputStream;

import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.io.CacheAndWriteOutputStream;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.io.CachedOutputStreamCallback;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;

public class MyInterceptor2 extends AbstractPhaseInterceptor{

        public MyInterceptor2() {
                super(Phase.READ);     // LINE 1
        }

        public void handleMessage(Message message) throws Fault {
                OutputStream os = 
(OutputStream)message.getContent(OutputStream.class);
                if(os == null)
                        return;           // LINE 2
                final CacheAndWriteOutputStream newOut = new
CacheAndWriteOutputStream(os);
                message.setContent(OutputStream.class, newOut);
                newOut.registerCallback(new LoggingCallback());
        }

        /**
         * Logging callback classs which caches and
         * writes the soap envelope to a StringBuilder.
         */
        class LoggingCallback implements CachedOutputStreamCallback {
                public void onFlush(CachedOutputStream cos) {
                }
                public void onClose(CachedOutputStream cos) {
                        try {
                                StringBuilder buffer = new StringBuilder();
                                cos.writeCacheTo(buffer);

                        }catch (Exception e) {
                        }
                }
        }
}
-- 
View this message in context: 
http://cxf.547215.n5.nabble.com/Accessing-SOAP-message-in-Interceptor-tp2640804p2640804.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to