我对Apache CXF很新,我一直坚持从外部服务器收到的SOAP消息中删除命名空间的问题(我作为服务器的客户端使用)
从wsdl生成的存根在@WebResult中具有不同的命名空间,而从服务器系统接收的SOAP信封不同。 我想应用通用解决方案,以便从响应消息中删除命名空间,以便客户端验证不会失败。
o.a.c.p.PhaseInterceptorChain - {http://www.abc.xyz/webservices/facade}服务的拦截器#{{{{}}}} serviceName抛出异常,立即展开
org.apache.cxf.interceptor.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行进入无限循环
答案 0 :(得分:0)
我终于能够通过以下
解决这个问题了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:Unexpected元素这样的任何异常。