2014-06-16 24 views
5

Sto eseguendo alcune convalide nel gestore personalizzato e in caso di errore che invia risposta al client dal gestore personalizzato. Tuttavia, il payload originale della richiesta client viene anche restituito al client. Come il corpo può essere svuotato dal messaggio di risposta? Se eseguo il debug di SoapBody sembra essere vuoto, ma in qualche modo il payload originale viene restituito al client.Come sostituire il corpo della risposta in ESSO WSO2 4.8.1 Gestore personalizzato

Ecco la mia funzione per l'invio di un messaggio all'utente.

private void myAuthErrorHandler(MessageContext msgCtx) 
{ 
    Axis2MessageContext axis2smc = (Axis2MessageContext) msgCtx; 
    org.apache.axis2.context.MessageContext axis2MessageCtx = axis2smc.getAxis2MessageContext(); 

    SOAPBody body = msgCtx.getEnvelope().getBody(); 

    // remove the existing payload 
    for (Iterator itr = body.getChildElements(); itr.hasNext();) { 
     OMElement child = (OMElement) itr.next(); 
     child.detach(); 
    } 

    log.error(""+msgCtx.getEnvelope()); 
    axis2MessageCtx.setProperty("HTTP_SC", "403"); 
    axis2MessageCtx.setProperty("NO_ENTITY_BODY", new Boolean("true")); 
    axis2MessageCtx.setProperty("RESPONSE", "true"); 
    axis2MessageCtx.setTo(null); 
    Axis2Sender.sendBack(msgCtx); 
} 

log.error ("" + msgCtx.getEnvelope()); sembra essere vuoto ma il corpo originale (carico utile) viene rinviato al client.

<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body></soapenv:Body></soapenv:Envelope> 

È possibile che si tratti di un errore o perché il corpo originale viene rinviato al client? C'è qualche altro metodo per cancellare il corpo della risposta?

Grazie per qualsiasi aiuto.

risposta

7

far cadere il corpo del messaggio, è possibile utilizzare un mediatore di proprietà nella sequenza come segue:

<property name="NO_ENTITY_BODY" value="true" scope="axis2" type="BOOLEAN"/> 

In alternativa è possibile utilizzare un mediatore script come bene.

<script language="js"><![CDATA[mc.getEnvelope().getBody().getFirstElement().detach();]]></script> 

Se entrambi non funzionano, verificare se la propria configurazione dispone di un mediatore di registro. (<log level="full"/>). Se è lì, prova a rimuoverlo. (In alcune versioni ESB precedenti, c'era un bug in cui quando si aggiunge un mediatore di registro con livello = completo, il corpo della risposta non viene rilasciato coz causa la rigenerazione del corpo per la registrazione. Ma AFAIK, è stato corretto in 4.8 .x versioni ... quindi questo potrebbe non essere il tuo caso ...)

+0

Per me ha funzionato l'alternativa al mediatore di script in ESB WSO2 4.8.1. – Chilcano