我有一个由wsdl文件生成的Soap服务,它需要特定的TargetNamespace。
@WebResult(name = "getResponse", targetNamespace = "http://targetNameSpace1.com", partName = "result")
但是我们有多个客户端调用这个接口,每个客户端使用一个不同的TargetNamespace:
客户端一:
<soap:Envelope
xmlns:loc="http://targetNameSpace1.com">
<soap:Header>
<ns3:RequestSOAPHeader>
...
</ns3:RequestSOAPHeader>
</soap:Header>
<soap:Body>
<loc:getResponse>
<loc:value>url/</loc:value>
</loc:getResponse>
</soap:Body>
</soap:Envelope>
客户端二:
<soap:Envelope
xmlns:loc="http://targetNameSpace2.com">
<soap:Header>
<ns3:RequestSOAPHeader>
...
</ns3:RequestSOAPHeader>
</soap:Header>
<soap:Body>
<loc:getResponse>
<loc:value>url/</loc:value>
</loc:getResponse>
</soap:Body>
</soap:Envelope>
这是我得到的错误:
<soap:Envelope>
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Message part {http://targetNameSpace2.com}getResponse was not recognized. (Does it exist in service WSDL?)</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
我只能让它在webResult中一次更改一个targetNameSpace标签,但我的最终目标是忽略这个标签,因为我不知道每个客户端将使用哪个名称空间。
目前,我正在尝试使用一个拦截器来扩展这个AbstractSoapInterceptor
,我得到了一个SoapMessage对象,我可以在请求发出之前访问它,但我似乎不能更改请求,不确定这是否是最好的方法。
有人有解决这个问题的办法吗?
谢谢!
发布于 2020-10-28 05:57:37
wsdl和(嵌入式) xsd是您指定的契约。服务器和客户端需要遵守该约定。更改合同单面将导致无效消息。与其寻找接受无效消息的解决方案,不如更新客户端,让它们遵守合同。
发布于 2020-10-28 16:18:28
我最终关注了这篇文章https://www.javatips.net/blog/cxf-interceptor-example,
我截取每个请求,并替换为:
xmlns:loc="http://targetNameSpace2.com"
对于我想要的url,我使用正则表达式替换了loc标记中的内容。
https://stackoverflow.com/questions/64561319
复制