Я создал прокси-верблюд, который принимает SOAP (через HTTP) и RESTful запросы и пересылает их на правильный веб-сервис. Camel не знает о структуре сообщений, он не знает WSDL или что-то еще, он просто знает, является ли это SOAP или нет в соответствии с заголовком http. Конечной точки CXF нет.Camel return simple SoapFault без CXF/Spring-ws
Далее он обрабатывает некоторые виды обработки. Исключение может происходить внутри, например, когда служба не найдена или URL недействителен. Есть ли простой способ вернуть действительный SOAPFault прямо с этого верблюда? Я попытался написать простой процессор, который называется onException. Это выглядит следующим образом:
.choice().when().header("SOAP").processRef(ExceptionToSoapProcessor())
Процессор, который должен превратить любое исключение в SoapFault выглядит следующим образом
@Override
public void process(Exchange exchange) throws Exception {
Exception exception = (Exception) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
Integer responseCode = (Integer) exchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE);
QName qName = SoapFault.FAULT_CODE_SERVER;
if (responseCode != null && responseCode < 500) {
qName = SoapFault.FAULT_CODE_CLIENT;
}
SoapFault fault = new SoapFault(exception.getMessage(), qName);
Message outMessage = exchange.getOut();
outMessage.setHeader(Message.RESPONSE_CODE, 500);
outMessage.setFault(true);
outMessage.setBody(fault);
exchange.setException(null);
exchange.removeProperty(Exchange.EXCEPTION_CAUGHT);
exchange.setProperty(Exchange.EXCEPTION_HANDLED, true);
}
Но теперь я не понимаю, как я мобилизует его, реакция выглядит следующим образом :
org.apache.cxf.binding.soap.SoapFault: Unauthorized
("Несанкционированный" является фактическим сообщение)
PS: Я раньше использовал dataformat SOAP, но, как уже упоминалось, у меня нет ServiceInterface в этом Camel.
Это именно то, что я искал, спасибо! – Chrisport