Исходящий перехватчик CXF получает тело ответа мыла, которое всегда является нулем? - PullRequest
5 голосов
/ 22 июня 2011

Я пишу перехватчик для теста. Но я получаю, что тело сообщения Soap в Перехватчике всегда равно нулю.

Мой Cxf - Apache-CXF-2.4.0

bean.xml выглядит так:

<cxf:bus>
    <cxf:outInterceptors>
        <ref bean="myOutSoapInterceptor"/>
  </cxf:outInterceptors>
</cxf:bus>

Файл перехватчика:

public class MySoapInterceptorImpl extends AbstractSoapInterceptor implements IMySoapInterceptor {

public MySoapInterceptorImpl()
{
    super(Phase.WRITE );
    addAfter(SoapOutInterceptor.class.getName());
}


public void handleMessage(SoapMessage msg) throws Fault {
    // TODO Auto-generated method stub
    String soapContent ;
    SOAPMessage sm = msg.getContent(SOAPMessage.class);

    /*sm is always null!*/
    }
 }

Ответы [ 3 ]

9 голосов
/ 08 мая 2012

Чтобы получить ответ xml из сообщения мыла, вы можете использовать «CacheAndWriteOutputStream» и «CachedOutputStreamCallback».В классе обратного вызова вы можете получить сообщение до закрытия потока.Скажем, наш out LoggingInterceptor - это «wsLoggingOutInterceptor», который можно настроить в файле контекста следующим образом:

<bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
<bean id="logOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<bean id="wsLoggingOutInterceptor" class="org.jinouts.webservice.logging.WSLoggingOutInterceptor"></bean>

   <cxf:bus>
        <cxf:inInterceptors>
            <ref bean="loggingInInterceptor"/>           
        </cxf:inInterceptors>
        <cxf:outInterceptors>
            <ref bean="logOutInterceptor"/>
            <ref bean="wsLoggingOutInterceptor"/>
       </cxf:outInterceptors>
    </cxf:bus>

Обратите внимание, что здесь у нас также есть перехватчик по умолчанию, который доступен с jar-файлами CXF.Теперь в нашем собственном перехватчике мы можем написать следующее сообщение для регистрации выходного ответного сообщения или вы также можете отредактировать здесь:

/**
 * @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 )
    {

    }   
}

Посмотрите этот сайт для получения более подробной информации: http://cxf.apache.org/docs/interceptors.html

3 голосов
/ 28 июня 2011

Сообщение зависит от фазы, в которой вы находитесь в данный момент. Вы можете найти список с фазами в Перехватчик доку . Если вы пытаетесь получить содержание сообщения, вам нужно найти наш, в каком формате оно существует. Посмотрите в getContentFormats . Некоторые объекты не дадут вам сообщение. Наибольшее время CXF работает с потоками. Таким образом, объект потока может быть сброшен.

С наилучшими пожеланиями Christian

2 голосов
/ 23 сентября 2011

Ваш перехватчик должен запускаться после SAAJOutInterceptor ();Например Блог Глена Маззы

...