CXF outgoing Interceptor get soap response body that is always null?

后端 未结 3 1222
暖寄归人
暖寄归人 2021-01-01 02:09

I write a Interceptor for test. But I get Soap message body in the Interceptor is always null.

My Cxf is Apache-CXF-2.4.0

bean.xml is like this:



        
3条回答
  •  旧时难觅i
    2021-01-01 02:33

    To get the response xml from the soap message, you can use the "CacheAndWriteOutputStream" and "CachedOutputStreamCallback". In the callback class you can get the message before closing the stream. Say, our out LoggingInterceptor is "wsLoggingOutInterceptor" which can be configured in the context file as follows :

    
    
    
    
       
            
                           
            
            
                
                
           
        
    

    Note that, here we have also some default interceptor which is available with the CXF jars. Now in our own interceptor we can write in the following way to log the output response message or you can also edit here :

    /**
     * @author asraf
     * asraf344@gmail.com
     */
    public class WSLoggingOutInterceptor extends AbstractLoggingInterceptor
    {
        public WSLoggingOutInterceptor() 
        {
            super(Phase.PRE_STREAM );
        }
    
        @Override
        public void handleMessage ( Message message ) throws Fault
        {
            // TODO Auto-generated method stub
            OutputStream os = message.getContent ( OutputStream.class );
            CacheAndWriteOutputStream cwos = new CacheAndWriteOutputStream ( os);
            message.setContent ( OutputStream.class, cwos );
    
            cwos.registerCallback ( new LoggingOutCallBack ( ) );
        }
    
        @Override
        protected Logger getLogger ( )
        {
            // TODO Auto-generated method stub
            return null;
        }
    }
    class LoggingOutCallBack implements CachedOutputStreamCallback
    {
        @Override
        public void onClose ( CachedOutputStream cos )
        {
            try
            {
                if ( cos != null )
                {
                    System.out.println ("Response XML in out Interceptor : " + IOUtils.toString ( cos.getInputStream ( ) ));
                }
    
            }
            catch ( Exception e )
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }       
        }
    
        @Override
        public void onFlush ( CachedOutputStream arg0 )
        {
    
        }   
    }
    

    Have a look at this site for more details : http://cxf.apache.org/docs/interceptors.html

提交回复
热议问题