6
votes

L'intercepteur sortant CXF Obtenez le corps de réponse du savon qui est toujours nul?

J'écris un intercepteur pour le test. Mais je reçois le corps du message de savon dans l'intercepteur est toujours nul.

Mon CXF est Apache-CXF-2.4.0 P>

haricot.xml est comme ceci: P>

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!*/
    }
 }


1 commentaires

Vous recherchez le contenu du savon en tant que chaîne ou comme objet?


3 Réponses :


4
votes

Le message dépend de la phase que vous êtes en ce moment. Vous pouvez trouver une liste avec des phases dans Interceptor doku . Si vous essayez d'obtenir le contenu du message, vous devez trouver notre format dans lequel le message existe. Jetez un coup d'œil à getContentFormats . Certains des objets ne vous donneront pas le message. Le plus de temps CXF fonctionne avec des flux. Donc, l'objet de flux pourrait être rincé.

avec les meilleures salutations Christian


0 commentaires


11
votes

Pour obtenir la réponse XML à partir du message SOAP, vous pouvez utiliser le "CACHEANDWRITEOutPutStream" et "CachedOutPutStreamCallback". Dans la classe de rappel, vous pouvez obtenir le message avant de fermer le flux. Dites, notre imbécileTinterceptor est "wsloggingoutinterceptor" qui peut être configuré dans le fichier de contexte comme suit: xxx pré>

Notez que, nous avons également un intercepteur par défaut disponible avec les pots CXF. Maintenant, dans notre propre intercepteur, nous pouvons écrire de la manière suivante pour enregistrer le message de réponse de sortie ou vous pouvez également modifier ici: P>

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

    }   
}


0 commentaires