使用xfire进行webservice开发

最近在项目中需要用到xfire进行webservice进行开发,所以写一篇博文把学习xfire的内容记录下来。xfire是较老的webservice框架了,新版本现在已经更名为Apache CXF,但是因为与老系统的兼容性问题,本次还是要使用xfire进行开发,关于Apache CXF的开发会在后面的报文中介绍。(源码打包在文末。)

1.创建项目并导入需要的JAR包。

创建一个普通的JAVA WEB项目,并通过MAVEN或手动添加以下JAR文件。

xfire服务端

###

2.写入项目配置文件。

在项目的web.xml文件中加入xfire的配置信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>xfire-learning</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>
org.codehaus.xfire.transport.http.XFireConfigurableServlet
</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>

</web-app>

3.开发服务

首先定义要定义服务的接口HelloFireIService.java,接口中包括3个方法:helloWord(将客户端传递的字符串返回)、find(根据客户端传递的学生姓名找到对应的学生实体类)、findAll(返回包括所有学生实体类的List)。

package info.aviraer.xfire.service;

import java.util.List;

import info.aviraer.xfire.bean.Student;

public interface HelloFireIService {

public String helloWorld(String str);

public Student find(String name);

public List<Student> findAll();

}

1
然后实现HelloFireIService接口(为了方便,并未使用数据库操作,只是随意返回数据)

package info.aviraer.xfire.service;

import info.aviraer.xfire.bean.Student;

import java.util.ArrayList;
import java.util.List;

public class HelloFireService implements HelloFireIService {

@Override
public String helloWorld(String str) {
    return str;
}

@Override
public Student find(String name) {
    Student student = new Student();
    student.setName(name);
    student.setAge(20);
    return student;
}

@Override
public List<Student> findAll() {
    Student student1 = new Student();
    Student student2 = new Student();
    List<Student> students = new ArrayList<Student>();
    student1.setName("Tom");
    student1.setAge(21);
    student2.setAge(23);
    student2.setName("Jerry");
    students.add(student2);
    students.add(student1);
    return students;
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
实体类:
<pre class="lang:default decode:true" title="Student.java">package info.aviraer.xfire.bean;

public class Student {

private String name;

private Integer age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}

}

4.写入服务配置文件

这里需要写入services.xml(配置xfire所有服务)和HelloFireIService.aegis.xml(HelloFireIService的配置),需要注意的是HelloFireIService.aegis.xml需要和接口放在同一个包中,services.xml需要放在src/META-INF/xfire/中。

xfire开发2

两个配置文件的格式如下:

<?xml version=”1.0” encoding=”UTF-8”?>
<beans xmlns=”http://xfire.codehaus.org/config/1.0">

&lt;service&gt;
    &lt;name&gt;HelloFireService&lt;/name&gt;
    &lt;namespace&gt;http://localhost/HelloFireService&lt;/namespace&gt;
    &lt;serviceClass&gt;info.aviraer.xfire.service.HelloFireIService&lt;/serviceClass&gt;
    &lt;implementationClass&gt;info.aviraer.xfire.service.HelloFireService&lt;/implementationClass&gt;
&lt;/service&gt;

</beans>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<pre class="lang:default decode:true" title="HelloFireIService.aegis.xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;mappings&gt;
&lt;mapping&gt;

&lt;method name="helloWorld"&gt;
&lt;parameter index="0" componentType="java.lang.String" /&gt;
&lt;/method&gt;

&lt;method name="find"&gt;
&lt;parameter index="0" componentType="java.lang.String" /&gt;
&lt;return-type componentType="info.aviraer.xfire.bean.Student" /&gt;
&lt;/method&gt;

&lt;method name="findAll"&gt;
&lt;return-type componentType="info.aviraer.xfire.bean.Student" /&gt;
&lt;/method&gt;

&lt;/mapping&gt;
&lt;/mappings&gt;

5.编写客户端

客户端通常情况下是在另一个工程中实现的,但是这里为了方便就在同一个工程中实现。

将HelloFireIService接口拷贝到客户端的包中,新建一个client.java如下

package info.aviraer.xfire.client;

import info.aviraer.xfire.bean.Student;

import java.net.MalformedURLException;
import java.util.List;

import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

public class Client {

public static void main(String[] args) {
    Service srvcModel = new ObjectServiceFactory()
            .create(HelloFireIService.class);
    XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
            .newInstance().getXFire());

    String serviceUrl = "http://localhost:8080/xfire-learning/services/HelloFireService";
    try {
        HelloFireIService srvc = (HelloFireIService) factory.create(
                srvcModel, serviceUrl);
                    System.out.println(srvc.helloWorld("Hello world!"));
        Student student = srvc.find("tom");
        System.out.println(student.toString());
        List&lt;Student&gt; list = srvc.findAll();
        for(Student s : list){
            System.out.println(s.toString());
        }
        System.out.println();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
}

}

1
2
3
4
5
6
7
8
9
10

### 6.测试

直接运行客户端,客户端正常运行并输出结果,测试成功。

![xfire客户端测试](/images/2016/08/xfire客户端测试.png)

### 7.与Spring共存

xfire与新版的Spring似乎有一些冲突,Spring4.0测试报错,目前可以正常使用的是Spring3.2.12,maven依赖如下

<project xmlns=”http://maven.apache.org/POM/4.0.0" xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>info.aviraer</groupId>
<artifactId>xfire-spring</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>xfire-spring Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>3.2.12.RELEASE</spring.version>
</properties>

&lt;dependencies&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
        &lt;artifactId&gt;javax.servlet-api&lt;/artifactId&gt;
        &lt;version&gt;3.1.0&lt;/version&gt;
        &lt;scope&gt;provided&lt;/scope&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-core&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-web&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-webmvc&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-context-support&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.codehaus.xfire&lt;/groupId&gt;
        &lt;artifactId&gt;xfire-all&lt;/artifactId&gt;
        &lt;version&gt;1.2.6&lt;/version&gt;
        &lt;exclusions&gt;
            &lt;exclusion&gt;
                &lt;groupId&gt;org.springframework &lt;/groupId&gt;
                &lt;artifactId&gt;spring &lt;/artifactId&gt;
            &lt;/exclusion&gt;
        &lt;/exclusions&gt;
    &lt;/dependency&gt;

&lt;/dependencies&gt;
&lt;build&gt;
    &lt;finalName&gt;xfire-spring&lt;/finalName&gt;
&lt;/build&gt;

</project>

`
以上就是xfire开发的简单搭建过程,如果需要开发webservice还是推荐使用更新的cxf等框架。

WEB项目源码包,Spring集成源码包下载:xfire-spring xfire-learning