公司最近的项目要用到WebService,本来以前用过CXF的,但是现在的系统框架一直以来都是用XFire,上头为了保持统一,决定还是采用XFire来实现,所以我又来补了
以最简单的HelloWorld为例,来了解XFire的工作流程
开发环境:Win7+MyEclipse6.5+Jdk1.6+Tomcat6+Spring2.5+XFire1.2
我们先来写服务端,发布一个WebService的服务接口
一、环境搭建
在MyEclipse中新建web工程,取名HelloWebService,首先添加Spring的jar包支持,可以参考我的SSH开发环境详细搭建(配置文件)
然后添加XFire支持,也是利用MyEclipse,在项目名上点右键->MyEclipse->选择WebService XFire支持。
它会生成services.xml文件,不需要用它,将它删除掉。
它也会在web.xml中生成XFireSpringServlet的过滤器,这个要,留着:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>XFireServlet</servlet-name> <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
在web.xml中添加我们的Spring启动配置:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/*.xml</param-value> </context-param>
发布到tomcat,启动看下是否报错,结果发现一直报下面这个错:
org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
初一看觉得是Spring配置文件头部没有DOCTYPE,结果加上去不好使,上网查发现是引的XFire的jar包里面的Spring1.2版本与开始添加的2.5版本冲突。
解决办法:删除XFire中的低版本的Spring包,因为它是MyEclipse添加的jar包关联,所以要删除,得删除关联,然后再添加XFire中除了Spring1.2的其它Jar包,如果在MyEclipse中找不到,可以去网上搜“XFire所有Jar包下载”关键字
重新添加XFire的jar包,再启服务就好了
二、写Java接口
添加Java接口与实现,用于对外提供服务:
package com.yuwl.webservice; /** * WebService接口 * @author yuwl */ public interface IHelloWebService { String sayHello(String name); }
实现:
package com.yuwl.webservice; /** * 接口实现 * @author yuwl * */ public class HelloWebServiceImp implements IHelloWebService { public String sayHello(String name) { return "hello WS: "+name; } }
并添加到applicationContext.xml中,供XFire访问:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="HelloWS" class="com.yuwl.webservice.HelloWebServiceImp"/> </beans>
三、配置XFire
配置导出器将我们的接口发布成wsdl服务
在Src目录下新建xfire-servlet.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 引入XFire预配置信息 --> <import resource="classpath:org/codehaus/xfire/spring/xfire.xml" /> <!-- 定义访问的url --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <entry key="/HelloWebService"> <ref bean="HelloWebService" /> </entry> </map> </property> </bean> <!-- 使用XFire导出器 --> <bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" lazy-init="false" abstract="true"> <!-- 引用xfire.xml中定义的工厂 --> <property name="serviceFactory" ref="xfire.serviceFactory" /> <!-- 引用xfire.xml中的xfire实例 --> <property name="xfire" ref="xfire" /> </bean> <bean id="HelloWebService" parent="baseWebService"> <!-- 业务服务bean --> <property name="serviceBean" ref="HelloWS" /> <!-- 业务服务bean的窄接口类 --> <property name="serviceClass" value="com.yuwl.webservice.IHelloWebService" /> </bean> </beans>
好了,到此一个简单的HelloWorld WebService服务开发完成了,发布测试一下:
http://localhost:8080/HelloWebService/services/IHelloWebService?wsdl
发现可以看到生成的xml文档数据,有我们定义的接口元素,就说明服务端开发成功了。
四、客户端测试
新建Java工程,导入刚才引的XFire jar包。
将生成的wsdl文档保存为wsdl格式的文件,放入src目录下
建立Java类用main方法来测试我们的服务:
package com.yuwl.test; import org.codehaus.xfire.client.Client; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; /** * WebService客户端测试 * @author yuwl */ public class WebServiceTest { public static void main(String[] args) throws Exception { String wsdl = "IHelloWebService.wsdl"; //对应的WSDL文件 Resource resource = new ClassPathResource(wsdl); Client client = new Client(resource.getInputStream(), null); //根据WSDL创建客户实例 Object[] objArray = new Object[1]; objArray[0] = "yuwl"; //调用特定的Web Service方法 Object[] results = client.invoke("sayHello", objArray); System.out.println("result: " + results[0]); } }
运行main方法,发现报错:
java.lang.NoClassDefFoundError: org/apache/ws/commons/schema/resolver/URIResolver
一看就知道是少jar包,上百度搜这个错,发现是少了XmlSchema-1.1.jar,下载下来引进去,再测就好了,打印结果:result: hello WS: yuwl
至此一个简单的HelloWorld,基于XFire的WebService开发完成了,但在实际的项目开发中,各个系统间的相互对接远不只这么简单,让我们在它的基础上,继续前行吧。