由于之前用的是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),那么对于客户端(第三方)调用访问时,需要按照接口类所在包(路径)进行命名空间的定义,仅此而已。
以上做为日志记下,希望能对来访博友有用!
分享到:
相关推荐
使用CXF生成动态调用webservice接口的客户端,也比较简单。
cxf客户端出现GBK编码问题解决cxf客户端出现GBK编码问题解决jar.rar
cxf客户端调用axis服务端流程
cxf生成客户端 服务端代码
CXF 客户端最少jar包支持,CXF 客户端最少jar包支持,CXF 客户端最少jar包支持,
cxf在创建客户端出现编码GBK-不可映射字符的编码问题解决的jar
1.使用Java 2.用cxf开发webservice ...客户端也需要接口类文件和pojo,和cxf客户端xml 但是没有接口的实现类,就是为了去服务端来调用的。 具体有不懂可以问我 给我发消息, 劳烦评价 ,请大家支持原创 禁止转载
apache-cxf-2.7.7以及cxf客户端所需要的jar包,命令生成webservice客户端
CXF webservice 动态地址客户端相关代码和jar包 CXF webservice 动态地址客户端相关代码和jar包
cxf 开发webservice客户端 代码经过测试
webservice客户端,框架为CXF,生成客户端的方式为自动(myeclipse生成)
用CXF作为客户端调用webService的demo:本人亲测可用,eclipse工程项目包含完整代码和完整jar包, 只要用eclipse导入项目即可,运行控制台显示success或者false字符串,说明OK。
cxf客户端调用axis服务端流程.docxcxf客户端调用axis服务端流程.docx
cxf调用webservice,客户端最少jar包,只需4个,告别找jar包的繁琐
cxf生成webservice客户端代码
CXF客户端生成器,可以直接进入bin目下,运行wsdl2java
CXF客户端调用例子,本例子开发语言为JAVA,包内包含服务端跟客户端
WebService开发客户端 cxf方式
cxf3.0.2 客户端所需jar包,支持jdk1.7,1.6请自行寻找
费了我两天的劲才把需要最少的jar包给搞明白了,共享出来需要的可以试试!