如何从服务器收到的 soap 消息中删除命名空间

How to remove namespace from the soap message received from server

我是 Apache CXF 的新手,我遇到了从外部服务器接收到的 SOAP 消息中删除命名空间的问题(我作为客户端使用该服务)

从 wsdl 生成的存根在 @WebResult 中具有不同的命名空间,而从服务器系统接收到的 SOAP 信封也不同。 我想应用一个通用的解决方案,以便从响应消息中删除命名空间,这样客户端验证就不会失败。

o.a.c.p.PhaseInterceptorChain - Interceptor for {http://www.abc.xyz/webservices/facade}service#{http://www.abc.xyz/webservices/facade}serviceName has thrown exception, unwinding now

org.apache.cxf.interceptor.Fault: Unexpected element {http://www.abc.xyz/webservices/facade}serviceResponse found. Expected {http:// www.abc.xyz/webservices/facade/xxx}serviceResponse.

请帮忙。

到目前为止尝试过的解决方案:

(CXF 转换功能)

Map<String, String> inTransformMap = Collections.singletonMap("{http:// www.abc.xyz/webservices/facade/**xxx**}serviceResponse", "");
org.apache.cxf.interceptor.transform.TransformInInterceptor transformInInterceptor = new org.apache.cxf.interceptor.transform.TransformInInterceptor();
transformInInterceptor.setInTransformElements(inTransformMap);
proxy.getInInterceptors().add(transformInInterceptor);

在这种方法中,当我尝试用 "" 替换 {http://www.abc.xyz/webservices/facade/**xxx**}serviceResponse 时,服务器挂起并在 org.apache.cxf.staxutils.transform.InTransformReader.handleDeepDrop() 行 266

处进入无限循环

我终于能够通过以下方式解决这个问题

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
Map<String, Object> props = factory.getProperties();
if (null == props) {
    props = new HashMap<String, Object>();
}
props.put("soap.no.validate.parts", true);
factory.setProperties(props);

上述解决方案将允许关闭传入响应验证,因此不会出现任何异常,例如 org.apache.cxf.interceptor.Fault:意外元素。