Я пишу 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 как 400.
Но я получаю что-то вроде этого: HTTP/1.1 500