天天看点

XFire与Spring集成的第一种方式

完整版见https://jadyer.github.io/

XFire与Spring的集成方式,我所测试过的,有两种

①取道org.springframework.web.servlet.DispatcherServlet

②取道org.codehaus.xfire.spring.XFireSpringServlet

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

有关第二种方式的资料,请参阅我的下一篇博文——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即可查看到WSDL信息了