大家好,欢迎来到IT知识分享网。
这次通过CXF实现Webservice服务端/客户端操作,花费近一周才完成,在编写过程中发现很多问题,便于以后使用,调用成功后进行粗略总结。
环境描述:当前使用的CXF为2.7.6,Spring为3.26版本
一、版本问题
1、之前使用的版本为cxf2.2.6版本,现有maven中配置为2.7.6,在使用过程中服务端发布服务和服务端工程进行服务调用没有任何问题,同时在低版本(如:cxf2.2.6)版本中客户端调用也没有问题,但是在2.7.6版本的客户端工程进行服务调用就会报错,通过
JaxWsProxyFactoryBean方式创建客户端调用时,报:javax.xml.ws.soap.SOAPFaultException Cannot create a secure XMLInputFactory错误,查阅相关资料,问题描述:“当前CXF使用的版本(2.7.x)依赖于Woodstox4.2.0,CXF客户端调用时需要“安全XMLInputFactory”,,必须在调用时实现XMLInputFactory的装载提”,另外一个解决方案是采用低版本替换使用,目前采用2.6.0客户端调用成功。
Cxf2.7.X和spring3.2.X下类库截图:
二、配置技术点
1、关于bean的声明
要发布或者要调用的web service接口,需要用@WebService注解声明。不过要注意的是,@WebService注解不会把类声明为spring的bean,可以声明为bean的方式有以下4个:
<jaxws:endpoint>
<jaxws:client>
<bean id="" class="">
@Component
2、cxf获取implementor的spring bean
CXF高版本框架中通过implementor=”com.huawei.framework.webservice.HelloWorldImpl” />获取的bean不是spring容器中HelloWordImp对应的bean,而是通过反射或其他机制创造出来的,在implementor属性中,用#beanName,这样的话,cxf框架得到的HelloWorldImpl,就是spring容器持有的那个bean。当然这有个前提,就是系统中已经存在这个bean。采用用或者@Component定义spring bean。
三、问题描述
1、CXF中使用Autowired注解无法注入bean
2、javax.xml.ws.soap.SOAPFaultException Cannot create a secure XMLInputFactory
3、org.apache.cxf.binding.soap.SoapFault Fault occurred while processing
4、org.apache.cxf.common.i18n.UncheckedException No operation was found with the name
5、org.apache.cxf.interceptor.Fault Unexpected wrapper element
6、org.apache.cxf.service.factory.ServiceConstructionException Failed to create service
问题总结为几类:
1、webservice接口实现类中如何引用Spring Bean
2、客户端和服务端targetNamespace不一样
3、CXF版本问题
4、客户端调用服务端方法参数不一致
问题参考资料:
1、http://stackoverflow.com/questions/16903216/cxf-2-7-x-woodstox-compatibility-via-maven?answertab=oldest#tab-top
2、http://www.iteye.com/topic/1122268#2382969
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/23837.html