仅配置了 SOAP12,但出现错误"Incoming SOAP message protocol is version 1.1"



我已经使用 JAX-WS 在 WebSphere (7) 中配置了 WebService。在上周,一切都经过了测试,但是今天,在清理和刷新之后,我收到一个错误:

由以下原因引起:javax.xml.ws.soap.SOAPFaultException: 传入的 SOAP 消息 协议的版本为 1.1,但终结点配置为 SOAP 1.2。 不支持此操作。 在 org.apache.axis2.jaxws.marshaller.impl.alt.MethodMarshallerUtils.createSystemException(MethodMarshallerUtils.java:1310) 在 org.apache.axis2.jaxws.marshaller.impl.alt.MethodMarshallerUtils.demarshalFaultResponse(MethodMarshallerUtils.java:1036) 在 org.apache.axis2.jaxws.marshaller.impl.alt.DocLitBareMethodMarshaller.demarshalFaultResponse(DocLitBareMethodMarshaller.java:412) 在 org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.getFaultResponse(JAXWSProxyHandler.java:529) 在 org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.createResponse(JAXWSProxyHandler.java:470) 在 org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:377) 在 org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invoke(JAXWSProxyHandler.java:185)

最令人惊讶的是,SOAP 1.1从未在那里配置过。从一开始,只使用了 SOAP 1.2。以下是我的WSDL的摘要:

<wsdl:definitions name="ucmdbservice"
    targetNamespace="http://service.my/v3" 
    xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
    xmlns:tns="http://service.my/v3"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:binding name="binding_soap12_v3" type="tns:v3">
        <soap12:binding style="document"
            transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="getResult">
            <soap12:operation
                soapAction="http://service.my/v3/getResult" />
            <wsdl:input>
                <soap12:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="service_v3">
        <wsdl:port name="port_soap12_v3" binding="tns:binding_soap12_v3">
            <soap12:address location="http://host.my/v3"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

以下是 Servlet 类的标头注释:

@javax.jws.WebService(wsdlLocation = "wsdl/myservice_v3.wsdl", 
       endpointInterface = "my.service.V3", 
       targetNamespace = "http://service.my/v3", 
       serviceName = "myservice_v3", 
       portName = "port_soap12_v3")
@javax.xml.ws.BindingType(value = javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)

以及从同一 WSDL 生成的客户端注释:

@WebServiceClient(name = "myservice_v3", 
    targetNamespace = "http://service.my/v3", 
    wsdlLocation = "../../wsdl/myservice_v3.wsdl")

一切都已经奏效了。它在IBM RAD 8.0中进行了测试,所以我想是一些RAD问题,而不是WebSphere-issue或JAX-WS-issue,但可能是这样,我没有看到定义中明显缺少的东西。

注意:出于机密性原因,服务名称和命名空间已更改,因此不要查找命名空间不匹配:)

这是客户端的问题,特别是 JAX-WS 生成的客户端存根构造函数的问题。

我已经通过调用 3 参数构造函数解决了这个问题:

MyServiceV3 service = new MyServiceV3(
  MyService.class.getResource("/wsdl/myservice_v3.wsdl",
  new QName("http://service.my/v3"), "myservice_v3");

而不是基于该 strage 生成代码的输出的无参数构造函数:

  baseUrl = MyServiceV3 .class.getResource(".");
  url = new URL(baseUrl, "../../wsdl/myservice_v3.wsdl");

最新更新