`

CXF动态客户端总是提示No operation was found with the name {...},命名空间问题

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

在经过列子测试中
接口类:com.service.ISaveLove.java;
业务类:com.service.spring.SaveLoveImpl.java;
方法:public String saveLove(String love);
结果发现,总是提示
No operation was found with the name {http://spring.service.com/}saveLove

后来从博客中得到一定灵感,来源博客为 http://lost-alien.iteye.com/blog/1175859
发现楼主所描述的问题很类似,楼主所描述的:
{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(targetNamespace = "http://service.com/",
    endpointInterface = "com..service.ISaveLove")
能明确定义命名空间所在位置。

.................. 2014-11-20 .................
后来回过头来看发布报文:
在没有加入targetNamespace参数作为指定命名空间时,如果接口类和业务类不在同一个路径下,那么Webservice是能正常启动,但是从报文的描述中,可以看到
<wsdl:definitions name="SaveLoveImplService" targetNamespace="http://spring.service.com/">
而在加入指定命名空间时,比如
@WebService(targetNamespace = "http://service.com/",endpointInterface = "com.service.ISaveLove")
那么报文就是
<wsdl:definitions name="SaveLoveImplService" targetNamespace="http://service.com/">

如果在不指定命名空间时就发布的,也是可以访问到了,通过在客户端中指定命名空间即可(即指定到与发布出来的默认命名空间一致),如下:
private static final QName SERVICE_NAME = new QName("http://spring.service.com/", "SaveLoveImplService");  // 指定到了业务类所在包http://spring.service.com/
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
client = factory.createClient("服务发布地址......?wsdl"); // 记得要加入"?wsdl"
QName opName = new QName("http://service.com/", "saveLove");  // 指定到接口类所在包
Object[] res = client.invoke(opName, "猪打天下");
System.out.println("Say: " + res[0]);

重点:CXF发布用的是业务类(SaveLoveImpl.java),那么默认的命名空间就会是业务类所在包(路径),而对外界暴露的则是接口类(ISaveLove.java),那么对于客户端(第三方)调用访问时,需要按照接口类所在包(路径)进行命名空间的定义,仅此而已。



以上做为日志记下,希望能对来访博友有用!


分享到:
评论
4 楼 PangSir 2014-11-20  
kobe1029 写道
只有这种解决方法吗?自定义targetNamespace就无法解决???

已更新,希望对你有帮助。
3 楼 jpsb 2013-10-24  
感谢分享,问题解决 
2 楼 kobe1029 2012-07-13  
只有这种解决方法吗?自定义targetNamespace就无法解决???
1 楼 hawk0035 2012-05-28  
遇到了一样的问题,按照楼主方法解决

相关推荐

Global site tag (gtag.js) - Google Analytics