Я пишу CXF OutFaultInterceptor для выдачи пользовательского сообщения об ошибке SOAP при реализации веб-службы SOAP в Mule ESB версии 3.8.1
Проблема заключается в том, что для каждого сбоя SOAP я получаю HTTP STATUS CODE 500с сервера.Я хотел бы изменить КОД СОСТОЯНИЯ в зависимости от типа ошибки, например 400, для неверного запроса.
Как это сделать?
Я попытался установить для MESSAGE.RESPONSE_CODE значение 400, а для PHASE -PRE_STREAM и MARSHAL.
Но это не работает.Ниже приведен пример кода:
public class SampleCxfFaultInterceptor extends AbstractSoapInterceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(EservicesCxfFaultInterceptor.class);
public SampleCxfFaultInterceptor() {
super(Phase.PRE_STREAM);
}
public void handleMessage(SoapMessage soapMessage) throws Fault {
Fault fault = (Fault) soapMessage.getContent(Exception.class);
if (fault.getCause() instanceof org.mule.api.transformer.TransformerMessagingException) {
LOGGER.error("INTERNAL ERROR OCCURED WHILE PROCESSING REQUEST);
soapMessage.remove(Message.RESPONSE_CODE);
soapMessage.put(Message.RESPONSE_CODE,new Integer(400));
Element detail = fault.getOrCreateDetail();
Element errorDetail = detail.getOwnerDocument().createElement("errorDetail");
Element errorCode = errorDetail.getOwnerDocument().createElement("errorCode");
Element message = errorDetail.getOwnerDocument().createElement("message");
errorCode.setTextContent("500");
message.setTextContent("INTERNAL_ERROR");
errorDetail.appendChild(errorCode);
errorDetail.appendChild(message);
detail.appendChild(errorDetail);
}
}
private Throwable getOriginalCause(Throwable t) {
if (t instanceof ComponentException && t.getCause() != null) {
return t.getCause();
} else {
return t;
}
}
Ожидаемый результат будет получить HTTP STATUS Code как 400.
Но я получаю что-то вроде этого: HTTP / 1.1 500