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),那么对于客户端(第三方)调用访问时,需要按照接口类所在包(路径)进行命名空间的定义,仅此而已。


以上做为日志记下,希望能对来访博友有用!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值