Как заменить тело ответа в пользовательском обработчике WSO2 ESB 4.8.1

#wso2 #wso2esb #esb

#wso2 #esb #wso2-esb

Вопрос:

Я выполняю некоторую проверку в пользовательском обработчике и в случае ошибки отправляю ответ обратно клиенту из пользовательского обработчика. Однако исходная полезная нагрузка клиентского запроса также отправляется обратно клиенту. Как удалить тело из ответного сообщения? Если я отлаживаю SOAPBody, он кажется пустым, но все же каким-то образом исходная полезная нагрузка отправляется обратно клиенту.

Вот моя функция для отправки сообщения обратно пользователю.

 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()); выглядит пустым, но все же исходное тело (полезная нагрузка) отправляется обратно клиенту.

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

Возможно, это ошибка или почему исходное тело отправляется обратно клиенту? Есть ли какие-либо другие способы очистки тела ответа?

Спасибо за любую помощь.

Ответ №1:

Чтобы удалить тело сообщения, вы можете использовать посредник свойств в следующей последовательности:

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

В качестве альтернативы вы также можете использовать посредник скрипта.

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

Если оба не работают, проверьте, есть ли в вашей конфигурации посредник журнала. ( <log level="full"/> ). Если он есть, попробуйте удалить его.
(В некоторых старых версиях ESB была ошибка, из-за которой при добавлении посредника журнала с level=full тело ответа не отбрасывается, потому что это приводит к перестройке тела для ведения журнала. Но AFAIK, это было исправлено в 4.8.x versions…so возможно, это не относится к вашей проблеме …)

Комментарии:

1. Для меня работала альтернатива скриптового посредника в WSO2 ESB 4.8.1.