我是Apache CXF的新手,我一直在处理从外部服务器接收的SOAP消息中删除命名空间的问题(我充当使用服务的客户端)
从wsdl生成的存根在@WebResult中具有不同的命名空间,而从服务器系统接收的SOAP信封则不同。我想应用一个通用的解决方案,以便从响应消息中删除命名空间,这样客户端验证就不会失败。
o.a.c.p.PhaseInterceptor Chain-的拦截器{http://www.abc.xyz/webservices/facade}服务#{http://www.abc.xyz/webservices/facade}serviceName引发异常,正在展开
org.apache.cxf.enterceptor.Fault:意外元素{http://www.abc.xyz/webservices/facade}找到serviceResponse。应为{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.enterceptor.Fault:意外元素。