- 浏览: 3422109 次
- 性别:
- 来自: 珠海
文章分类
- 全部博客 (1633)
- Java (250)
- Android&HTML5 (111)
- Struts (10)
- Spring (236)
- Hibernate&MyBatis (115)
- SSH (49)
- jQuery插件收集 (55)
- Javascript (145)
- PHP (77)
- REST&WebService (18)
- BIRT (27)
- .NET (7)
- Database (105)
- 设计模式 (16)
- 自动化和测试 (19)
- Maven&Ant (43)
- 工作流 (36)
- 开源应用 (156)
- 其他 (16)
- 前台&美工 (119)
- 工作积累 (0)
- OS&Docker (83)
- Python&爬虫 (28)
- 工具软件 (157)
- 问题收集 (61)
- OFbiz (6)
- noSQL (12)
最新评论
-
HEZR曾嶸:
你好博主,这个不是很理解,能解释一下嘛//左边+1,上边+1, ...
java 两字符串相似度计算算法 -
天使建站:
写得不错,可以看这里,和这里的这篇文章一起看,有 ...
jquery 遍历对象、数组、集合 -
xue88ming:
很有用,谢谢
@PathVariable映射出现错误: Name for argument type -
jnjeC:
厉害,困扰了我很久
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# -
TopLongMan:
非常好,很实用啊。。
PostgreSQL递归查询实现树状结构查询
http://my.oschina.net/bayer/blog/52490
实战CXF调用Webxml天气预报服务
今晚群里的kasasis同学问我会不会使用CXF调用
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
这个天气预报的WebService服务;
我也是初学者, 在尝试调用的过程中发现不少问题, 也有一些小心得, 希望与大家分享, 更希望大家可以帮我解惑.
一.初探:通过wsdl2java生成调用远程服务所需要的java类
因为还没有成功使用dynamic-clients(http://cxf.apache.org/docs/dynamic-clients.html)的方式动态调用过WebService服务, 所以决定使用CXF提供的wsdl2java来生成调用WebService服务所必须的java类, 进而使用JaxWsServerFactoryBean来调用WebService服务:
遗憾的是, CXF wsdl2java报错了:
undefined element declaration 's:schema'
at line 85 column 41 of schema
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
将该wsdl下载下来, 使用MyEclipse 9.0打开并查看, 也提示了这一错误:
src-resolve.4.2: Error resolving component 's:schema'.
It was detected that 's:schema' is in namespace 'http://www.w3.org/2001/XMLSchema', but components from this namespace are not referenceable from schema document 'file:///D:/workspace/workspace_j2ee/CXFWeatherTest/src/WeatherWebService.asmx.original.wsdl'.
If this is the incorrect namespace, perhaps the prefix of 's:schema' needs to be changed.
If this is the correct namespace, then an appropriate 'import' tag should be added to 'file:///D:/workspace/workspace_j2ee/CXFWeatherTest/src/WeatherWebService.asmx.original.wsdl'.
wsdl报错部分内容如下(下边代码红色部分):
作为初学者, 曾在风中叶老师的视频中学习过关于schema及DTD的一些知识, 但还没修炼到能解决这一错误的程度, 也期待各位同学的积极探索并给出答案;
问题催人奋进, 折衷的办法总是有的:
<s:any/>既然可以代表任何元素, 为什么不能代表<s:element ref="xxx"/>元素呢? 于是乎, 愤然删除<s:element ref="s:schema" />, 勉强算是通过了CXF提供的wsdl验证工具wsdlvalidator的验证;
Ok, 继续之前的步骤, 通过wsdl2java来生成调用远程WebService服务所需要的java类;
一切顺利, 生成的类的目录结构如下:
二.使用JaxWsProxyFactoryBean调用天气服务
本工程使用的jar包如下图示:
通过JaxWsProxyFactoryBean调用webService服务的过程相信大家都很熟悉了, 具体代码如下:
运行还算顺利, 得到的结果如下:
信息: Outbound Message
---------------------------
ID: 1
Address: http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
Encoding: UTF-8
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=["http://WebXml.com.cn/getWeatherbyCityName"]}
Payload:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getWeatherbyCityName xmlns="http://WebXml.com.cn/">
<theCityName>南阳</theCityName>
</getWeatherbyCityName>
</soap:Body>
</soap:Envelope>
河南
南阳
57178
57178.jpg
2012-4-5 22:58:11
11℃/24℃
4月6日 晴
无持续风向微风
0.gif
0.gif
今日天气实况:气温:16℃;风向/风力:北风 0级;湿度:53%;空气质量:较差;紫外线强度:中等
穿衣指数:建议着薄型套装等春秋过渡装。年老体弱者宜着套装。但昼夜温差较大,注意适当增减衣服。
感冒指数:昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。
运动指数:天气较好,赶快投身大自然参与户外运动,尽情感受运动的快乐吧。
洗车指数:适宜洗车,未来持续两天无雨天气较好,适合擦洗汽车,蓝天白云、风和日丽将伴您的车子连日洁净。
晾晒指数:天气不错,适宜晾晒。赶紧把久未见阳光的衣物搬出来吸收一下太阳的味道吧!
旅游指数:天气晴朗,风和日丽,温度适宜,是个好天气哦。这样的天气很适宜旅游,您可以尽情地享受大自然的风光。
路况指数:天气较好,路面比较干燥,路况较好。
舒适度指数:温度适宜,风力不大,您在这样的天气条件下,会感到比较清爽和舒适。
空气污染指数:气象条件较不利于空气污染物稀释、扩散和清除,请适当减少室外活动时间。
紫外线指数:属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。
11℃/24℃
4月7日 晴
无持续风向微风
0.gif
0.gif
10℃/23℃
4月8日 阴转多云
无持续风向微风
2.gif
1.gif
南阳市位于河南省西南部,北靠伏牛山,东扶桐柏山,西依秦岭,南临汉江。..................
三.使用JaxWsDynamicClientFactory调用天气服务
CXF关于Dynamic-clients的介绍文档见:
http://cxf.apache.org/docs/dynamic-clients.html
很简洁的一段官方示例代码:
但具体的调用过程并非一帆风顺; 让人不解的是, 即使调用自己所创建的WebService, 使用动态方式调用也不能成功, 总会提示一个异常:
Exception in thread "main" java.lang.IllegalStateException: Unable to write generated Java files for schemas: null
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:351)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:234)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:227)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:182)
at com.client.Test.dynamicStudent(Test.java:30)
at com.client.Test.main(Test.java:38)
Caused by: java.lang.reflect.UndeclaredThrowableException
at $Proxy29.build(Unknown Source)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:349)
... 5 more
Caused by: java.lang.NoSuchMethodException:
com.sun.codemodel.internal.JCodeModel.build(java.lang.Object)
at java.lang.Class.getMethod(Class.java:1605)
at org.apache.cxf.common.util.ReflectionInvokationHandler.invoke(ReflectionInvokationHandler.java:50)
... 7 more
异常信息的最后一个Caused by给了我线索:
java.lang.NoSuchMethodException:
com.sun.codemodel.internal.JCodeModel.build(java.lang.Object)
遍历工程所用jar文件, 居然没有找到internal包下的类JCodeModel;
但报的异常是NoSuchMethodException, 而不是ClassNotFoundException, 表明该类是存在的, 可能包路径发生了变化, 遂STFG(search the fUcking google. 从陈皓老师的博文学到的 - - 囧), 最终发现该类现存在于jaxb-xjc-2.2.4-1.jar中, 包路径为com.sun.codemodel, 而不是异常中所提示的com.sun.codemodel.internal;
为什么会这样? 难道是我的jaxb-xjc jar包的版本不对?
遂通过http://jaxb.java.net/, 对比jaxb2.0.1 -- 2.2.5之间的所有版本, 均没有找到包com.sun.codemodel.internal...
Ok, 让我们继续查找jaxb1.x版本的jar包;
幸运的是, 在页面[url]http://jaxb.java.net/nonav/2.0.1/docs/jaxb-1_0.html [/url], 终于有所发现:
JAXB 2.0 is backwards compatible with JAXB 1.0 - you can deploy your existing 1.0 applications on the 2.0 runtime (provided that you also bundle the jaxb1-impl.jar) and they should run without modification.
查看我的项目的类库, 刚好缺少了这么一个jaxb-impl.jar包,,, 加上该包(我使用的是jaxb-impl-2.2.4-1.jar), 再次运行动态调用天气预报WebService的服务, Congratulations! 这个异常被干掉了!
但是, 不要高兴的太早, 服务并没有调用成功, 因为又回到了最开始遇到的问题:
<s:element ref="s:schema" />,
undefined element declaration 's:schema'
at line 85 column 41 of schema
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
具体调用代码如下:
值得欣慰的是, 在补充了jaxb-impl-2.2.4-1.jar之后, 可以通过动态方式成功调用自己创建的WebService服务了, 详见下节;
四.使用JaxWsDynamicClientFactory动态调用自己创建的WebService服务
服务接口及实现类很简单:
接口 com.service.StudentService:
实现类 com.service.impl.StudentServiceImpl:
server类: com.jettyServer.ServerForJetty:
client类:com.client.Test
先启动JettyServer, 后访问http://localhost:9000/student?wsdl, 成功刷新出wsdl, Ok, 服务顺利启动!
再执行Test的main方法, Congratulations! 这次真正使用Dynamic的方式, 在不需要通过wsdl2java生成客户端java类文件的情况下, 成功调用WebService服务!
至于不能通过这种方式成功调用
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
的问题, 还需要在进一步学习Schema和DTD的知识才能解答;
五.小结:
虽未能通过Dynamic的方式成功调用天气预报服务, 好歹wsdl2java生成客户端调用类
的方式是可行的.
六.其他问题:
6.1.@WebService声明问题
在"四.使用JaxWsDynamicClientFactory调用自己创建的WebService服务"中
自定义服务接口的实现类com.service.impl.StudentServiceImpl的类声明之前, 仅注释声明了@WebService, 而没有后边的(endpointInterface="com.service.StudentService",
targetNamespace="http://service.com/"), 这时使用动态代理方式调用该服务时, 会发生异常:
Exception in thread "main"
org.apache.cxf.common.i18n.UncheckedException: No operation was found with the name {http://impl.service.com/}helloStudent.
大概还是因为WSDL的基础知识不够过硬吧, STFG后, 在
http://lost-alien.iteye.com/blog/1175859 找到答案:
在com.service.impl.StudentServiceImpl的类声明之前, 正确注释了
@WebService(
endpointInterface="com.service.StudentService", targetNamespace="http://service.com/")之后,
再使用动态方式调用该服务, 一切顺利!
具体原因还有待分析, 认识和理解!
6.2.关于CXF wsdl2java生成的调用远程服务的客户端java类文件
在"四.使用JaxWsDynamicClientFactory调用自己创建的WebService服务"中所描述的自定义WebService服务中, 若使用JaxWsServerFactoryBean的调用方式, 那么首先需要通过wsdl2java生成客户端必需的java类文件;
将通过自己的wsdl生成的客户端java类文件的目录结构&类名称,
和wsdl2java http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
这个wsdl文件后生成的java类文件的目录结构&类名称, 对比之后, 发现差距明显:
对比可以清楚的看到, 自己的wsdl生成的客户端类文件, 其java类文件名及其混乱, 始终没能弄懂为什么会这样? 还请各位同学多多指教!
实战CXF调用Webxml天气预报服务
今晚群里的kasasis同学问我会不会使用CXF调用
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
这个天气预报的WebService服务;
我也是初学者, 在尝试调用的过程中发现不少问题, 也有一些小心得, 希望与大家分享, 更希望大家可以帮我解惑.
一.初探:通过wsdl2java生成调用远程服务所需要的java类
因为还没有成功使用dynamic-clients(http://cxf.apache.org/docs/dynamic-clients.html)的方式动态调用过WebService服务, 所以决定使用CXF提供的wsdl2java来生成调用WebService服务所必须的java类, 进而使用JaxWsServerFactoryBean来调用WebService服务:
遗憾的是, CXF wsdl2java报错了:
undefined element declaration 's:schema'
at line 85 column 41 of schema
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
将该wsdl下载下来, 使用MyEclipse 9.0打开并查看, 也提示了这一错误:
src-resolve.4.2: Error resolving component 's:schema'.
It was detected that 's:schema' is in namespace 'http://www.w3.org/2001/XMLSchema', but components from this namespace are not referenceable from schema document 'file:///D:/workspace/workspace_j2ee/CXFWeatherTest/src/WeatherWebService.asmx.original.wsdl'.
If this is the incorrect namespace, perhaps the prefix of 's:schema' needs to be changed.
If this is the correct namespace, then an appropriate 'import' tag should be added to 'file:///D:/workspace/workspace_j2ee/CXFWeatherTest/src/WeatherWebService.asmx.original.wsdl'.
wsdl报错部分内容如下(下边代码红色部分):
<s:element name="getSupportDataSetResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="getSupportDataSetResult"> <s:complexType> <s:sequence> <s:element ref="s:schema" /> <s:any /> </s:sequence> </s:complexType> </s:element> </s:sequence> </s:complexType> </s:element>
作为初学者, 曾在风中叶老师的视频中学习过关于schema及DTD的一些知识, 但还没修炼到能解决这一错误的程度, 也期待各位同学的积极探索并给出答案;
问题催人奋进, 折衷的办法总是有的:
<s:any/>既然可以代表任何元素, 为什么不能代表<s:element ref="xxx"/>元素呢? 于是乎, 愤然删除<s:element ref="s:schema" />, 勉强算是通过了CXF提供的wsdl验证工具wsdlvalidator的验证;
Ok, 继续之前的步骤, 通过wsdl2java来生成调用远程WebService服务所需要的java类;
一切顺利, 生成的类的目录结构如下:
二.使用JaxWsProxyFactoryBean调用天气服务
本工程使用的jar包如下图示:
通过JaxWsProxyFactoryBean调用webService服务的过程相信大家都很熟悉了, 具体代码如下:
package cn.com.client; import java.util.List; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import cn.com.webxml.ArrayOfString; import cn.com.webxml.WeatherWebServiceSoap; public class Test { public static void main(String[] args) throws Exception { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.getInInterceptors().add(new LoggingInInterceptor()); factory.getOutInterceptors().add(new LoggingOutInterceptor()); factory.setAddress( "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"); factory.setServiceClass(WeatherWebServiceSoap.class); WeatherWebServiceSoap client = (WeatherWebServiceSoap) factory.create(); ArrayOfString o = client.getWeatherbyCityName("南阳"); List<String> strList = o.getString(); for (String str : strList) { System.out.println(str); } } }
运行还算顺利, 得到的结果如下:
信息: Outbound Message
---------------------------
ID: 1
Address: http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
Encoding: UTF-8
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=["http://WebXml.com.cn/getWeatherbyCityName"]}
Payload:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getWeatherbyCityName xmlns="http://WebXml.com.cn/">
<theCityName>南阳</theCityName>
</getWeatherbyCityName>
</soap:Body>
</soap:Envelope>
河南
南阳
57178
57178.jpg
2012-4-5 22:58:11
11℃/24℃
4月6日 晴
无持续风向微风
0.gif
0.gif
今日天气实况:气温:16℃;风向/风力:北风 0级;湿度:53%;空气质量:较差;紫外线强度:中等
穿衣指数:建议着薄型套装等春秋过渡装。年老体弱者宜着套装。但昼夜温差较大,注意适当增减衣服。
感冒指数:昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。
运动指数:天气较好,赶快投身大自然参与户外运动,尽情感受运动的快乐吧。
洗车指数:适宜洗车,未来持续两天无雨天气较好,适合擦洗汽车,蓝天白云、风和日丽将伴您的车子连日洁净。
晾晒指数:天气不错,适宜晾晒。赶紧把久未见阳光的衣物搬出来吸收一下太阳的味道吧!
旅游指数:天气晴朗,风和日丽,温度适宜,是个好天气哦。这样的天气很适宜旅游,您可以尽情地享受大自然的风光。
路况指数:天气较好,路面比较干燥,路况较好。
舒适度指数:温度适宜,风力不大,您在这样的天气条件下,会感到比较清爽和舒适。
空气污染指数:气象条件较不利于空气污染物稀释、扩散和清除,请适当减少室外活动时间。
紫外线指数:属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。
11℃/24℃
4月7日 晴
无持续风向微风
0.gif
0.gif
10℃/23℃
4月8日 阴转多云
无持续风向微风
2.gif
1.gif
南阳市位于河南省西南部,北靠伏牛山,东扶桐柏山,西依秦岭,南临汉江。..................
三.使用JaxWsDynamicClientFactory调用天气服务
CXF关于Dynamic-clients的介绍文档见:
http://cxf.apache.org/docs/dynamic-clients.html
很简洁的一段官方示例代码:
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient("echo.wsdl"); Object[] res = client.invoke("echo", "test echo"); System.out.println("Echo response: " + res[0]);
但具体的调用过程并非一帆风顺; 让人不解的是, 即使调用自己所创建的WebService, 使用动态方式调用也不能成功, 总会提示一个异常:
Exception in thread "main" java.lang.IllegalStateException: Unable to write generated Java files for schemas: null
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:351)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:234)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:227)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:182)
at com.client.Test.dynamicStudent(Test.java:30)
at com.client.Test.main(Test.java:38)
Caused by: java.lang.reflect.UndeclaredThrowableException
at $Proxy29.build(Unknown Source)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:349)
... 5 more
Caused by: java.lang.NoSuchMethodException:
com.sun.codemodel.internal.JCodeModel.build(java.lang.Object)
at java.lang.Class.getMethod(Class.java:1605)
at org.apache.cxf.common.util.ReflectionInvokationHandler.invoke(ReflectionInvokationHandler.java:50)
... 7 more
异常信息的最后一个Caused by给了我线索:
java.lang.NoSuchMethodException:
com.sun.codemodel.internal.JCodeModel.build(java.lang.Object)
遍历工程所用jar文件, 居然没有找到internal包下的类JCodeModel;
但报的异常是NoSuchMethodException, 而不是ClassNotFoundException, 表明该类是存在的, 可能包路径发生了变化, 遂STFG(search the fUcking google. 从陈皓老师的博文学到的 - - 囧), 最终发现该类现存在于jaxb-xjc-2.2.4-1.jar中, 包路径为com.sun.codemodel, 而不是异常中所提示的com.sun.codemodel.internal;
为什么会这样? 难道是我的jaxb-xjc jar包的版本不对?
遂通过http://jaxb.java.net/, 对比jaxb2.0.1 -- 2.2.5之间的所有版本, 均没有找到包com.sun.codemodel.internal...
Ok, 让我们继续查找jaxb1.x版本的jar包;
幸运的是, 在页面[url]http://jaxb.java.net/nonav/2.0.1/docs/jaxb-1_0.html [/url], 终于有所发现:
JAXB 2.0 is backwards compatible with JAXB 1.0 - you can deploy your existing 1.0 applications on the 2.0 runtime (provided that you also bundle the jaxb1-impl.jar) and they should run without modification.
查看我的项目的类库, 刚好缺少了这么一个jaxb-impl.jar包,,, 加上该包(我使用的是jaxb-impl-2.2.4-1.jar), 再次运行动态调用天气预报WebService的服务, Congratulations! 这个异常被干掉了!
但是, 不要高兴的太早, 服务并没有调用成功, 因为又回到了最开始遇到的问题:
<s:element ref="s:schema" />,
undefined element declaration 's:schema'
at line 85 column 41 of schema
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
具体调用代码如下:
package com.client; import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; public class Test { public static void main(String[] args) throws Exception { JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient( "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl"); Object[] res = client.invoke("getSupportProvince"); System.out.println("Echo response: " + res[0]); } }
值得欣慰的是, 在补充了jaxb-impl-2.2.4-1.jar之后, 可以通过动态方式成功调用自己创建的WebService服务了, 详见下节;
四.使用JaxWsDynamicClientFactory动态调用自己创建的WebService服务
服务接口及实现类很简单:
接口 com.service.StudentService:
package com.service; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface StudentService { String helloStudent(@WebParam(name="text")String name); }
实现类 com.service.impl.StudentServiceImpl:
package com.service.impl; import javax.jws.WebService; import com.service.StudentService; @WebService(endpointInterface="com.service.StudentService", targetNamespace="http://service.com/") public class StudentServiceImpl implements StudentService{ public String helloStudent(String name) { return "hello " + name; } }
server类: com.jettyServer.ServerForJetty:
package com.jettyServer; import javax.xml.ws.Endpoint; import com.service.impl.StudentServiceImpl; public class ServerForJetty { public static void main(String[] args) throws InterruptedException { StudentServiceImpl implementor = new StudentServiceImpl(); String address = "http://localhost:9000/student"; Endpoint.publish(address, implementor); } }
client类:com.client.Test
package com.client; import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; public class Test { public static void main(String[] args) throws Exception { JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient("http://localhost:9000/student?wsdl"); Object[] res = client.invoke("helloStudent", "LeeThinker"); System.out.println("Echo response: " + res[0]); } }
先启动JettyServer, 后访问http://localhost:9000/student?wsdl, 成功刷新出wsdl, Ok, 服务顺利启动!
再执行Test的main方法, Congratulations! 这次真正使用Dynamic的方式, 在不需要通过wsdl2java生成客户端java类文件的情况下, 成功调用WebService服务!
至于不能通过这种方式成功调用
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
的问题, 还需要在进一步学习Schema和DTD的知识才能解答;
五.小结:
虽未能通过Dynamic的方式成功调用天气预报服务, 好歹wsdl2java生成客户端调用类
的方式是可行的.
六.其他问题:
6.1.@WebService声明问题
在"四.使用JaxWsDynamicClientFactory调用自己创建的WebService服务"中
自定义服务接口的实现类com.service.impl.StudentServiceImpl的类声明之前, 仅注释声明了@WebService, 而没有后边的(endpointInterface="com.service.StudentService",
targetNamespace="http://service.com/"), 这时使用动态代理方式调用该服务时, 会发生异常:
Exception in thread "main"
org.apache.cxf.common.i18n.UncheckedException: No operation was found with the name {http://impl.service.com/}helloStudent.
大概还是因为WSDL的基础知识不够过硬吧, STFG后, 在
http://lost-alien.iteye.com/blog/1175859 找到答案:
在com.service.impl.StudentServiceImpl的类声明之前, 正确注释了
@WebService(
endpointInterface="com.service.StudentService", targetNamespace="http://service.com/")之后,
再使用动态方式调用该服务, 一切顺利!
具体原因还有待分析, 认识和理解!
6.2.关于CXF wsdl2java生成的调用远程服务的客户端java类文件
在"四.使用JaxWsDynamicClientFactory调用自己创建的WebService服务"中所描述的自定义WebService服务中, 若使用JaxWsServerFactoryBean的调用方式, 那么首先需要通过wsdl2java生成客户端必需的java类文件;
将通过自己的wsdl生成的客户端java类文件的目录结构&类名称,
和wsdl2java http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
这个wsdl文件后生成的java类文件的目录结构&类名称, 对比之后, 发现差距明显:
对比可以清楚的看到, 自己的wsdl生成的客户端类文件, 其java类文件名及其混乱, 始终没能弄懂为什么会这样? 还请各位同学多多指教!
发表评论
-
SpringMVC + RESTful URL
2014-06-13 15:53 1752Spring REST是什么? http://blog.csd ... -
SpringMVC + WebSocket + X
2014-06-12 10:45 4607官方文档:WebSocket Support http://d ... -
Spring CXF实例
2014-05-20 21:28 1253参考:CXF Spring整合 ——又一个helloword! ... -
Supporting Spring-WS and Spring MVC integration in a project
2014-05-19 21:45 1189http://www.java-allandsundry.co ... -
Spring-WS示例
2014-05-18 14:32 2772参考http://blog.csdn.net/thinkgho ... -
使用 Spring 3 来创建 RESTful Web Services
2014-05-18 12:24 1234SpringMVC联手REST实现入门级的CRUD http: ... -
Solrj——Solr超强客户端
2013-06-15 10:54 1579原文 http://ilovejavaforever. ... -
Spring3.2 + cxf1.7.3整合
2013-04-08 14:43 1610参考:http://tsinglongwu.iteye.com ... -
Apache CXF 与 Spring 整合简单例子
2013-04-07 14:29 1221http://chxiaowu.iteye.com/blog/ ... -
CXF入门教程(5) -- webService异步调用模式
2013-04-07 14:28 1819原文参考: http://blog.csdn.net/near ... -
CXF入门教程(4) -- 设置上下文连接属性
2013-04-06 15:21 1568原文参考: http://blog.csd ... -
CXF入门教程(3) -- webService客户端开发步骤详解
2013-04-06 15:18 1683原文参考:http://blog.csdn.net/neare ... -
CXF入门教程(2) -- 第一个客户端
2013-04-06 15:11 1692参考:http://blog.csdn.net/nea ... -
CXF入门教程(1) -- 第一个webService
2013-04-06 15:06 1761参考:http://blog.csdn.net/neareas ... -
WSDL 详解
2012-09-01 16:40 2284WSDL 详解 http://blog.csdn.ne ... -
super(WSDL_LOCATION, SERVICE, features);异常
2012-08-31 09:33 1829http://ahaoo0712.iteye.com/blog ... -
Service的入门教程
2012-08-30 20:50 1342Web service是什么 http://www ...
相关推荐
总结来说,"webservice天气预报例子cxf实例"是一个展示如何使用Apache CXF创建和使用Web服务的示例,涵盖了Web服务的基本概念、CXF框架的功能,以及如何通过Java编写和调用Web服务接口。这个实例不仅有助于理解Web...
标题“myService_purpose1sv_cxf调用axis2的接口服务_接口服务_”暗示了一个名为“myService”的具体服务示例,这个服务利用CXF来调用Axis2实现的接口。"purpose1sv"可能是项目或功能的特定标识符,但没有足够的上...
本篇文章将详细介绍如何使用CXF和camel-cxf调用Web服务,以及这两个工具的核心功能和使用场景。 Apache CXF是一个全面的服务开发框架,它支持多种Web服务标准,如SOAP、WS-*协议栈、RESTful服务等。CXF提供了丰富的...
8. **异常处理**:Spring和CXF结合时,可以使用Spring的AOP来处理Web服务调用中的异常。例如,可以定义一个切面来捕获并处理CXF抛出的异常。 9. **测试和调试**:在集成测试中,可以使用Spring的TestContext框架和...
总之,使用CXF客户端调用Axis服务端涉及多个步骤,包括生成客户端代码、配置客户端、创建服务代理以及进行实际调用。理解这些步骤并正确实现它们是成功通信的关键。在实际开发过程中,可能会遇到各种问题,需要耐心...
用camel-cxf调用webservice和发布一个webservice接口例子,首先启动QueryServiceMain主函数启动webservice接口,然后启动测试类TestWebservice。例子主要是实现java代码实现camel调用webservice接口
- 对于客户端调用,可以使用CXF的`JaxWsProxyFactoryBean`创建服务代理对象,然后调用其方法进行服务调用。 4. **项目结构** - `.classpath`和`.project`是Eclipse IDE的项目配置文件。 - `pom.xml`是Maven的...
本教程将详细讲解如何使用Apache CXF框架在Java环境中调用C#编写的Web服务。 **CXF简介** Apache CXF是一个开源的Java框架,用于构建和服务导向架构(SOA)。它支持多种Web服务标准,如SOAP、RESTful API等,同时也...
java CXF客户端请求ERP SAP webservice通过用户名和密码验证功能!
5. **处理返回结果**:Web服务调用后,会返回一个XML格式的响应,需要解析这个响应来提取天气预报数据,如温度、湿度、风向等。 标签中的"Webservice"提示我们关注的重点在于Web服务的使用和实现。Web服务有多种...
在这个基于CXF的Web服务完整例子中,我们将深入探讨CXF的核心概念、配置、以及如何创建和调用Web服务。 1. **CXF框架介绍**:CXF,全称为"Code first eXtended Framework",最初由XFire项目发展而来,后与Apache ...
当我们需要在客户端调用Web服务时,CXF扮演着关键角色。本篇将详细讲解如何利用CXF客户端来调用Web服务以及所需的jar包。 首先,让我们了解CXF的基本概念。CXF是一个用于构建和服务导向架构(SOA)应用程序的开源...
CXF客户端调用例子展示了如何使用CXF来创建和消费Web服务。这个例子包含了服务端和客户端两部分,两者都是用Java语言编写的。 在Java中,CXF提供了丰富的API和工具,使得开发者能够方便地实现SOAP(Simple Object ...
【标题】"webservice动态访问天气预报(tomcat+jsp+servlet+webservice+cxf)"涉及的关键技术栈包括Web服务、服务器管理、前端交互等多个方面。本文将深入探讨这些技术在实现动态天气预报功能中的应用。 【描述】中...
C#动态调用CXF WEBSERVICE框架共通类。
本项目名为"JAVA用WebService实现调用天气预报功能",其核心是利用Java技术对接中央气象台的Web服务接口,获取并显示实时天气信息。 首先,理解Java中的WebService调用原理至关重要。SOAP是用于在Web上交换结构化和...
3. 参数传递与调用:设置方法参数并执行服务调用,CXF会处理底层的SOAP消息交换。 4. 处理响应:获取服务返回的结果,进行业务处理。 在给定的"webserviceDemo"压缩包中,可能包含了以下内容: - 服务端代码:包含...
在使用CXF框架进行Web服务客户端调用时,需要依赖一系列的JAR包来确保功能的正常运行。这些JAR包包含了CXF框架的核心组件、XML处理库、数据序列化工具、缓存机制、消息队列通信以及Spring框架的支持。 1. `cxf-core...
Java调用天气预报WebService是一个常见的任务,特别是在开发集成多种服务的应用程序时。WebService是一种基于XML标准的、平台和语言无关的通信协议,用于在不同系统间交换数据。在这个场景中,我们将探讨如何使用...
在本实战教程中,我们将深入探讨如何在服务器端使用CXF来发布和调用Web服务接口。 ### 1. CXF框架基础 CXF的核心在于其强大的服务引擎,它允许开发者以Java编程模型来定义服务接口,并自动生成相应的服务实现和...