Java Spring WS:Soap故障未标识为故障

Java Spring WS:Soap故障未标识为故障,java,soap,spring-ws,Java,Soap,Spring Ws,我正在使用SpringWS,当从webServiceTemplate通过MarshallSendReceive调用web服务时,我遇到了一个SOAP错误,错误代码为500。不幸的是,响应没有被识别为SOAP错误(它抛出了WebServiceTransportException)。理论上,当出现错误响应时,如果错误代码不同于2xx,则WebServiceTemplate会抛出WebServiceTransportException,除非http错误为500且内容是soap错误。以下是我收到的回复中

我正在使用SpringWS,当从webServiceTemplate通过MarshallSendReceive调用web服务时,我遇到了一个SOAP错误,错误代码为500。不幸的是,响应没有被识别为SOAP错误(它抛出了WebServiceTransportException)。理论上,当出现错误响应时,如果错误代码不同于2xx,则WebServiceTemplate会抛出WebServiceTransportException,除非http错误为500且内容是soap错误。以下是我收到的回复中的一个示例:

    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>"
HTTP/1.1500内部服务器错误[\r][\n]“
内容长度:887[\r][\n]“
连接:保持活动状态[\r][\n]“
2015-07-01 10:38:22873调试[o.s.ws.client.core.WebServiceTemplate]收到请求[SaajSoapMessage]的错误{http://www.example.com/schema/front}使用]

2015-07-01 10:38:22874调试[org.apache.http.wire]我从AbstractHttpSenderConnection(将被调用以确定错误是否为soap错误的方法)中挖掘了一点hasFault方法,我看到了该方法的下一个代码:

/*
 * 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;
}
/*
*缺点
*/
公共最终布尔值hasFault()引发IOException{
返回HttpTransportConstants.STATUS_INTERNAL_SERVER_ERROR==getResponseCode()和&isXmlResponse();
}
/**确定响应是否为XML消息*/
私有布尔值isXmlResponse()引发IOException{
迭代器迭代器=getResponseHeaders(HttpTransportConstants.HEADER\u CONTENT\u TYPE);
if(iterator.hasNext()){
String contentType=iterator.next().toLowerCase();
返回contentType.indexOf(“xml”)!=-1;
}
返回false;
}

这意味着,必须有一个ContentType=xml的http头,我调用的web服务没有设置该头。我现在必须研究如何在web服务模板中评估错误之前在响应中设置该头。

WebServiceTemplate
中的属性应该允许您解决此问题

感谢您的回答!设置为true(我已经扩展了这个类,以便能够插入日志,并且设置为true)。问题是响应没有发送HTTP头ContentType=xml。不,您应该将其设置为false以跳过检查内容类型的代码。