XFire与Spring的集成方式,我所测试过的,有两种
取道org.springframework.web.servlet.DispatcherServlet
取道org.codehaus.xfire.spring.XFireSpringServlet

本文演示的是XFire与Spring集成的第一种方式

首先是web.xml文件

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/myxfire-servlet.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>myxfire</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myxfire</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> <!-- 依据Spring规范,此时应创建一个名为myxfire-servlet的XML文件 --> <!-- 其中myxfire是这里配置的DispatcherServlet的名称 --> <!-- 此时就不需要service.xml了,因为Web服务的定义在myxfire-servlet.xml中可以找到 -->

接着是applicationContext.xml文件

<?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 --> <bean id="HelloServiceBean" class="com.jadyer.server.HelloServiceImpl" /> </beans>

然后是重头戏myxfire-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预配置信息 --> <!-- 在XFire核心JAR包中拥有一个预定义的Spring配置文件,即xfire.xml文件 --> <!-- 它定义了XFire在Spring中必须用到的一些Bean和资源 --> <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/> <!-- 定义访问的URL --> <!-- 注意:在Spring2.5中,此时需要额外引入spring-webmvc.jar --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <!-- 定义WebService的访问路径,有几个路径就需要配置几个<entry>信息 --> <!-- 本例中,WSDL访问地址为http://127.0.0.1:8080/XFire_Spring_02/XFireServer.ws?wsdl --> <entry key="/XFireServer.ws"> <ref bean="HelloService"/> </entry> </map> </property> </bean> <!-- 使用XFire导出器 --> <!-- XFire为Spring提供了方便易用的导出器XFireExporter --> <!-- 借助XFireExporter的支持,我们可以在Spring容器中将一个业务类导出为WebService --> <!-- 并且,按照标准的配置,对于任何导出器,都需要引入XFire环境,即serviceFactory和xfire属性 --> <!-- 其中ServiceFactory是XFire的核心类,它可以将一个POJO生成为一个WebService --> <!-- 本例中,这里通过定义一个baseWebService,其余的WebService配置可以将该bean作为父bean --> <!-- 这样可以简化Spring的配置,不需要多次引入serviceFactory和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> <!-- 定义暴露的WebService --> <bean id="HelloService" parent="baseWebService"> <!-- 业务服务bean --> <property name="serviceBean" ref="HelloServiceBean"/> <!-- 业务服务bean的窄接口类 --> <!-- 实际应用中,当某个类有很多的方法时,如果其中有几个方法不需要开放为WebService时 --> <!-- 那么此时我们可以定义一个窄接口,该接口中只需定义那些开放为WebService的业务方法 --> <!-- 窄接口中的方法在真实的系统中可能需要引用其它的业务类或DAO获取数据库中的真实数据 --> <!-- 其实,将一个业务类所有需要开放为WebService的方法通过一个窄接口来描述是值得推荐的 --> <!-- 这会让WebService的接口显得很干净 --> <!-- 并且XFire的导出器也需要服务接口的支持,因为它采用了基于接口的动态代理技术 --> <property name="serviceClass" value="com.jadyer.server.HelloService"/> </bean> </beans>

接下来我再将Web服务相应的接口和实现类粘贴出来
其实这里用到的接口和实现类等,与我之前的文章使用XFire开发WebServices服务端 里用到的,都是一样的

package com.jadyer.server; import java.util.List; import com.jadyer.model.Person; import com.jadyer.model.User; /** * 暴露成web服务的接口类 */ public interface HelloService { public String sayHello(String name); //简单对象的传递 public Person getPerson(User u); //对象的传递 public List<Person> getPersonList(Integer age, String name); //List的传递 }

然后是接口的实现类

package com.jadyer.server; import java.util.ArrayList; import java.util.List; import com.jadyer.model.Person; import com.jadyer.model.User; /** * 暴露成web服务的接口的实现类 * @see 该类必须显式或隐式的提供一个public的无参的【即默认的】构造函数 * @see 否则XFire将无法初始化该类 */ public class HelloServiceImpl implements HelloService { //Default constructor public HelloServiceImpl(){} public String sayHello(String name) { if(null==name){ return "Hello,World"; }else{ return "Hello," + name; } } public Person getPerson(User u) { Person p = new Person(); p.setAge(24); p.setName(u.getName()); return p; } public List<Person> getPersonList(Integer age, String name) { Person p = new Person(); p.setAge(age); p.setName(name); List<Person> list = new ArrayList<Person>(); list.add(p); return list; } }

最后是接口中用到的两个VO类

package com.jadyer.model; public class User { private String name; /*--getter和setter略--*/ } /** * 暴露成Web服务的接口用到的两个VO类 */ package com.jadyer.model; public class Person { private Integer age; private String name; /*--getter和setter略--*/ }

最后访问http://127.0.0.1:8080/项目名/XFireServer.ws?wsdl