L'intercepteur sortant CXF reçoit le corps de réponse soap qui est toujours nul?

j'écris un intercepteur pour le test. Mais je reçois le corps du message dans L'intercepteur est toujours nul.

mon Cxf est Apache-CXF-2.4.0

bean.xml est comme ceci:

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

fichier intercepteur:

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!*/
    }
 }
5
demandé sur jadarnel27 2011-06-22 14:10:07

3 réponses

pour obtenir la réponse xml à partir du message soap, vous pouvez utiliser les" CacheAndWriteOutputStream "et"CachedOutputStreamCallback". Dans la classe callback, vous pouvez obtenir le message avant de fermer le flux. Par exemple, notre out LoggingInterceptor est "wsLoggingOutInterceptor" qui peut être configuré dans le fichier de contexte comme suit:

<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>

notez que, Ici, nous avons aussi un intercepteur par défaut qui est disponible avec les bocaux CXF. Maintenant, dans notre propre intercepteur nous pouvons écrivez de la façon suivante pour enregistrer le message de réponse de sortie ou vous pouvez aussi éditer ici:

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

    }   
}

consultez ce site pour plus de détails: http://cxf.apache.org/docs/interceptors.html

9
répondu Asraful Haque 2012-05-08 15:30:11

le message dépend de la phase que vous êtes en ce moment. Vous pouvez trouver une liste avec les phases de Interceptor doku . Si vous essayez d'obtenir le contenu du message, vous devez trouver notre Dans quel format le message existe. Jetez un oeil dans getContentFormats . Certains objets ne vous donnera pas le message. La plupart du temps CXF fonctionne avec des flux. Pour que l'objet stream puisse être rincé.

avec mes meilleures salutations Chrétien

2
répondu Christian 2011-06-28 08:19:43

votre intercepteur doit être lancé après SAAJOutInterceptor(); Par exemple Glen Mazza Weblog

2
répondu pe4enko 2016-06-08 20:30:38