Spring-WS: ошибка мыла не идентифицирована как ошибка
Я использую Spring-WS и получаю ошибку SOAP с кодом ошибки 500 при вызове веб-службы через marshalSendAndReceive из webServiceTemplate. К сожалению, ответ не распознается как ошибка SOAP (он вызывает исключение WebServiceTransportException). Теоретически, когда возникает ответ об ошибке, WebServiceTemplate создает исключение WebServiceTransportException, если код ошибки отличается от 2xx, если только ошибка http не равна 500, а содержимое является ошибкой мыла. Вот пример из ответа, который я получаю:
HTTP/1.1 500 Internal Server Error[\r][\n]"
Content-Length: 887[\r][\n]"
Connection: keep-alive[\r][\n]"
2015-07-01 10:38:22,873 DEBUG [o.s.ws.client.core.WebServiceTemplate] Received error for request [SaajSoapMessage {http://www.example.com/schema/front}use]
2015-07-01 10:38:22,874 DEBUG [org.apache.http.wire] << "<?xml version="1.0" encoding="UTF-8"?>[\n]"
2015-07-01 10:38:22,874 DEBUG [org.apache.http.wire] << "[\n]"
2015-07-01 10:38:22,874 DEBUG [org.apache.http.wire] << "<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">[\n]"
2015-07-01 10:38:22,874 DEBUG [org.apache.http.wire] << " <SOAP-ENV:Body>[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << " <SOAP-ENV:Fault>[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << " <faultcode>SOAP-ENV:Server</faultcode>[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << " <faultstring>Request service/operation version not supported</faultstring>[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << " <faultactor>Server</faultactor>[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << " <detail>[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << " <ns0:serviceException xmlns:ns0="http://www.example.com/facade/interface/v1_1">[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << " <ns1:message xmlns:ns1="http://www.example.com/common/v1_3">InternalCode01</ns1:messageId>[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << " <ns1:text xmlns:ns1="http://www.example.com/common/v2_1">Request service/operation version not supported</ns1:text>[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << " </ns0:serviceException>[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << " </detail>[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << " </SOAP-ENV:Fault>[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << " </SOAP-ENV:Body>[\n]"
2015-07-01 10:38:22,875 DEBUG [org.apache.http.wire] << "</SOAP-ENV:Envelope>"
Кто-нибудь знает, почему это происходит? Есть ли способ просто рассматривать это как ошибку SOAP?
2 ответа
Я немного покопался в методе hasFault из AbstractHttpSenderConnection (тот, который будет вызываться для определения, является ли ошибка ошибкой или нет), и я вижу следующий код для этого метода:
/*
* Faults
*/
public final boolean hasFault() throws IOException {
return HttpTransportConstants.STATUS_INTERNAL_SERVER_ERROR == getResponseCode() && isXmlResponse();
}
/** Determine whether the response is a XML message. */
private boolean isXmlResponse() throws IOException {
Iterator<String> iterator = getResponseHeaders(HttpTransportConstants.HEADER_CONTENT_TYPE);
if (iterator.hasNext()) {
String contentType = iterator.next().toLowerCase();
return contentType.indexOf("xml") != -1;
}
return false;
}
Это означает, что должен быть заголовок http с ContentType = xml, который веб-служба, которую я вызываю, не настраивается. Теперь я должен исследовать, как установить этот заголовок в ответах, прежде чем ошибка будет оценена в шаблоне веб-службы.
checkConnectionForFault
недвижимость в WebServiceTemplate
должен позволить вам обойти эту проблему.