第一种方式见:http://playframework.wordpress.com/2010/08/15/web-services-using-play/
直接使用play!的WS工具类操作,对少量和简单接口来说非常方便。
现在主要分享一下第二种方式:在play!中使用 Apache CXF来使用webservice,其实你也可以选其它的看你自己的意愿了。
首先去http://cxf.apache.org/download.html下载apache cxf,然后把bin加到环境变量中备用。
然后你就可以看看官方的这个文档了解一下wsdl2java工具的使用 http://cxf.apache.org/docs/wsdl-to-java.html
wsdl2java -d 输出目录 -p 包名 -fe jaxws21 wsdl文件(这里可以是远程wsdl地址也可以是本地文件)
我在用这个工具生成时用远程地址时,由于报
WSDLToJava Error: Thrown by JAXB : undefined element declaration 's:schema'
更多可以看这里:http://hi.baidu.com/waltertan/blog/item/feee9f19b07b1d76dbb4bd4b.html 把远程的wsdl另存为,然后删除其中的s:schema,使用wsdl2java的时候使用本地这个wsdl生成java文件也是一样的。但是要注意一下wsdl文件中soap:address的配置是否正确,不然会悲剧的,我就悲剧过了,请求时总是提示不可连接超时。
说了这么多还没和超爱的play!扯上关系,接着来,把上一步生成的java文件复制到play!工程源码中,这样就可以在play! controllers中直接使用便利的webservice了。
public static void getCategory() { List<String> categories = (List<String>) Cache.get("categories"); if (categories == null) { Logger.info("getCategory远程服务获取数据"); WsDataEngineForWebSite ws = new WsDataEngineForWebSite(); WsDataEngineForWebSiteSoap wsp = ws.getWsDataEngineForWebSiteSoap12(); GetCategoryResult categoryResult = wsp.getCategory(); Element categoryElement = (Element) categoryResult.getAny(); categories = new ArrayList<String>(); for (Node event : XPath.selectNodes("//NewDataSet//Table1", categoryElement)) { String sort = XPath.selectText("sort", event); String name = XPath.selectText("name", event); String ename = XPath.selectText("ename", event); categories.add(StringUtils.trimToEmpty(sort) + "|" + StringUtils.trimToEmpty(name) + "|" + StringUtils.trimToEmpty(ename)); } Cache.set("categories", categories, "2min"); } render(categories); }
这里同时感谢下play!提供的XPath工具类,真是很方便,如果是用scala来做,解析起来更方便了,只是俺不熟不多扯。当然有工具可以将xml数据片段直接转为java object这样操作起来更方便,但没找到更简洁的转换办法,如果有告诉我一下,谢谢!
最后再说个技巧,如果频繁的用wsdl2java生成java文件复制也很麻烦,在eclipse中有很便捷的办法,见系列套图如下:
点run -> external tools -> External Tools Configurations将会弹出
你也在图上看到了怎么配置了,名字随你爱好,关键就是参数配置而已,其它的一目了然,建议把要生成的wsdl文件复制到工程根目录下,方便管理。
下图的配置就是说生成后刷新哪个目录,使生成的文件加载到工程中来,不用自己再去刷新一次工程目录,省事...
看看除了生成java代码是使用了apache cxf,运行时好像并不依赖它们,真是更省事!!!有木有!!!!以后要重新用wsdl2java生成java代码,只需手指一点这个扩展命令就自动生成了,方便吧!
---------------------------华丽分割线-------------------------------------
文章就止结束,如果你有更好的方法愿意分享就联系我吧!!923933533(都知道这是什么号吧) liujiuwu@gmail.com