`

客户端服务端同为cxf,报org.apache.cxf.common.i18n.UncheckedException: No operation was fou

阅读更多
异常:
org.apache.cxf.common.i18n.UncheckedException: No operation was found with the name {http://impl.service.ws.mywebapp.com/}validCodeReq.

我看了下wsdl里,有名为 validCodeReq的operation呀,奇了怪了。网上搜了好久也没有解决办法。最后只好attach了 cxf2.0.11的源码进行跟踪,后来发现,cxf会在其内部用一个map来保存QName,而这个map里,有validCodeReq,但是前半部分不对,不是 {http://impl.service.ws.mywebapp.com/},而是 {http://service.ws.mywebapp.com/}。原来是命名空间的问题!返回服务端代码,在服务实现类的注解 @WebService(endpointInterface = "com.mywebapp.ws.service.SomeService")中,加上一个属性 , targetNamespace="http://service.ws.mywebapp.com/",这下,问题就解决了。

总结: 看来这种错误还是对soap协议以及wsdl描述文件的格式不熟导致的。
疑问: 为啥用xfire做客户端,不做上述修改,也能正常调用呢??

分享到:
评论
7 楼 jack_sun 2013-11-29  
PangSir 写道
由于之前用的是Xfire,发现有些不稳定,并且由于业务的不多接入扩大,所以今天考了同时在项目中放入CXF2.6.0,确实有些包冲突,目前调整的话,Xfire服务器端可以和CXF共用新版本的xmlschema.jar,但在客户端Xfire只能用xmlschema.jar的旧版本;

今天下午也发现楼主所描述的问题,不过没从源代码Debug,但是看到了楼主所描述的:
{http://impl.service.ws.mywebapp.com/}
targetNamespace="http://service.ws.mywebapp.com/"
脑子闪过一下:
估计到http://service.ws.mywebapp.com/是接口类所在路径,
而http://impl.service.ws.mywebapp.com/应该是业务类所在位置,
CXF默认取的是接口类所在路径作为命名空间,Xfire确实不加入这个可以正确访问,也是由于命名空间正好是对的;

果然,经过测试:把接口类和业务类放在同一个路径下时,就能测试通过了,回过头去查了一下CXF自带的测试列子,里面也是把接口类和业务类放在同一个路径下(也是为了偷懒);其实按照楼主的做法还是比较科学,能明确定义命名空间所在位置。


@WebService(endpointInterface = "com.mywebapp.ws.service.SomeService")中,加上一个属性 , targetNamespace="http://service.ws.mywebapp.com/"。

加的是接口所在的namespace.如果不是接口所在的namespace,如,targetNamespace="http://abc.com",那operation的namespace还是service.ws.mywebapp.com,不是abc.com。那指定了也没用哇。
6 楼 sundongyadh 2013-04-18  
我是说 多个项目,引用同一个webservice。  就只有改成统一的包层次了吧~
5 楼 sundongyadh 2013-04-18  
如果我是对项目引用 同一个 webService 呢? 命名空间该如何更改呢?
4 楼 lost_alien 2012-04-24  
PangSir 写道
由于之前用的是Xfire,发现有些不稳定,并且由于业务的不多接入扩大,所以今天考了同时在项目中放入CXF2.6.0,确实有些包冲突,目前调整的话,Xfire服务器端可以和CXF共用新版本的xmlschema.jar,但在客户端Xfire只能用xmlschema.jar的旧版本;

今天下午也发现楼主所描述的问题,不过没从源代码Debug,但是看到了楼主所描述的:
{http://impl.service.ws.mywebapp.com/}
targetNamespace="http://service.ws.mywebapp.com/"
脑子闪过一下:
估计到http://service.ws.mywebapp.com/是接口类所在路径,
而http://impl.service.ws.mywebapp.com/应该是业务类所在位置,
CXF默认取的是接口类所在路径作为命名空间,Xfire确实不加入这个可以正确访问,也是由于命名空间正好是对的;

果然,经过测试:把接口类和业务类放在同一个路径下时,就能测试通过了,回过头去查了一下CXF自带的测试列子,里面也是把接口类和业务类放在同一个路径下(也是为了偷懒);其实按照楼主的做法还是比较科学,能明确定义命名空间所在位置。


谢谢!
3 楼 PangSir 2012-04-21  
由于之前用的是Xfire,发现有些不稳定,并且由于业务的不多接入扩大,所以今天考了同时在项目中放入CXF2.6.0,确实有些包冲突,目前调整的话,Xfire服务器端可以和CXF共用新版本的xmlschema.jar,但在客户端Xfire只能用xmlschema.jar的旧版本;

今天下午也发现楼主所描述的问题,不过没从源代码Debug,但是看到了楼主所描述的:
{http://impl.service.ws.mywebapp.com/}
targetNamespace="http://service.ws.mywebapp.com/"
脑子闪过一下:
估计到http://service.ws.mywebapp.com/是接口类所在路径,
而http://impl.service.ws.mywebapp.com/应该是业务类所在位置,
CXF默认取的是接口类所在路径作为命名空间,Xfire确实不加入这个可以正确访问,也是由于命名空间正好是对的;

果然,经过测试:把接口类和业务类放在同一个路径下时,就能测试通过了,回过头去查了一下CXF自带的测试列子,里面也是把接口类和业务类放在同一个路径下(也是为了偷懒);其实按照楼主的做法还是比较科学,能明确定义命名空间所在位置。
2 楼 thirdlife 2011-10-31  
遇到同样的问题,照上边改过咋还不行啊。。。。
用的spring+hibernate
1 楼 Jolence 2011-10-25  
受用了  谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics