未找到 [SaajSoapMessage {http://schemas.xmlsoap.org/soap/envelope/}UpdateXXXRequest] 的端点映射

No endpoint mapping found for [SaajSoapMessage {http://schemas.xmlsoap.org/soap/envelope/}UpdateXXXRequest]

我升级了一个旧应用程序,它公开了 6 个具有不同命名空间的不同 SOAP Web 服务。当我们使用通过其生成的 wsdl 获取的端点时,一切似乎都正常工作。

这是一个示例请求

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:pres="http://MY_NAMESPACE.com">
   <soapenv:Body>
      <pres:UpdateXXXRequest>
      </pres:UpdateXXXRequest>
   </soapenv:Body>
<soapenv:Envelope>

但是有一些客户端以下面的格式发送请求

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:pres="http://MY_NAMESPACE.com">
   <soapenv:Body>
      <q0:UpdateXXXRequest xmlns:q0="http://schemas.xmlsoap.org/soap/envelope/">
      </q0:UpdateXXXRequest>
   </soapenv:Body>
<soapenv:Envelope

由于命名空间 xmlns:q0="http://schemas.xmlsoap.[=,此请求导致错误 找不到端点 50=]/ 与负载 UpdateXXXRequest 一起使用。

根据我的分析,Spring 框架使用 EndpointMapping 来识别相应的方法,然后根据命名空间调用服务(或者与主体负载一起给出q0:UpdateXXXRequest xmlns:q0="http://schemas.xmlsoap.org/soap/envelope/" 或来自 soapenv:Envelop)

{http://schemas.xmlsoap.org/soap/envelope/}UpdateRxFillRequest 的情况下,它失败了,因为方法是用自己的命名空间定义的,并且 spring 只查找通过@Payload 注解用方法定义的命名空间。

如果它从 UpdateXXXRequest 中删除 q0 或使用实际命名空间它工作正常但客户端正在发送请求 http://schemas.xmlsoap.org/soap/envelope/

有什么方法可以支持http://schemas.xmlsoap.org/soap/envelope/&http://MY_NAMESPACE.com各方法.

尽管我有 100 多个端点。

我可以通过将 SOAP 方法上的@Payload 注释替换为允许添加多个@Payload 注释的@Payloads 来解决此问题。我添加了两个服务命名空间为 http://MY_NAMESPACE.com 的服务命名空间,第二个服务命名空间为 http://schemas.xmlsoap.org/soap/envelope/。 spring 框架识别了带有两个注释的 SOAP 端点。