如何从服务器

时间:2017-02-04 07:56:00

标签: java web-services soap wsdl cxf

我对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行进入无限循环

1 个答案:

答案 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元素这样的任何异常。