一、XFire(Java Web Service框架)配置与使用
1. 添加依赖
如果是Maven项目,在pom.xml中添加:
<dependency>
<groupId>org.codehaus.xfire</groupId>
<artifactId>xfire-all</artifactId>
<version>1.2.6</version>
</dependency>
如果是手动添加jar包,需要下载xfire-all-1.2.6.jar及相关依赖。
2. 编写Web Service接口和实现类
接口:
public interface HelloService {
String sayHello(String name);
}
实现类:
public class HelloServiceImpl implements HelloService {
public String sayHello(String name) {
return "Hello, " + name;
}
}
3. 配置XFire服务
web.xml配置
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
4. 创建services.xml文件
在WEB-INF下新建xfire/services.xml:
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloService</name>
<serviceClass>com.example.HelloService</serviceClass>
<implementationClass>com.example.HelloServiceImpl</implementationClass>
</service>
</beans>
5. 部署与访问
将项目部署到Tomcat等Servlet容器后,通过如下地址访问:
http://localhost:8080/你的项目名/services/HelloService?wsdl
6. 客户端调用
可以使用XFire提供的客户端API,也可以使用JAX-WS等工具生成客户端代码。
示例:
Service service = new ObjectServiceFactory().create(HelloService.class);
HelloService client = (HelloService) new XFireProxyFactory().create(service, "http://localhost:8080/你的项目名/services/HelloService");
String result = client.sayHello("World");
System.out.println(result);
常见问题
- 端口冲突:确保Tomcat等容器端口未被占用;
- 依赖缺失:检查
WEB-INF/lib下是否有所有XFire相关jar包; - 服务路径不对:确保
services.xml和web.xml路径、配置正确。
二、XFire 高级配置
1. 服务自定义配置(services.xml)
你可以为每个服务配置详细参数,比如命名空间、方法暴露、消息格式等:
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloService</name>
<namespace>http://service.example.com</namespace>
<serviceClass>com.example.HelloService</serviceClass>
<implementationClass>com.example.HelloServiceImpl</implementationClass>
<style>document</style> <!-- 支持rpc和document风格 -->
<use>literal</use> <!-- 支持literal和encoded -->
</service>
</beans>
2. 配置拦截器(Interceptor)
拦截器用于实现日志、安全认证、消息处理等功能:
<service>
...
<inHandlers>
<handler>
<handlerClass>com.example.MyInHandler</handlerClass>
</handler>
</inHandlers>
<outHandlers>
<handler>
<handlerClass>com.example.MyOutHandler</handlerClass>
</handler>
</outHandlers>
</service>
自定义 Handler 需要实现 org.codehaus.xfire.handler.AbstractHandler。
3. 集成 Spring
XFire 支持与 Spring 集成,服务可以直接由 Spring 管理:
applicationContext.xml:
<bean id="helloService" class="com.example.HelloServiceImpl" />
<xfire:service id="helloServiceBean" serviceClass="com.example.HelloService" implementationBean="helloService" />
web.xml:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
4. 配置 WSDL 细节
可以通过注解或配置文件自定义 WSDL 的结构,比如方法参数名、返回值类型等。
三、常用功能
1. 数据类型支持
XFire 支持常见的 Java 类型自动映射为 XML 类型,包括 List、Map、POJO 等。但复杂类型建议使用标准的 Java Bean,并确保有无参构造方法和 getter/setter。
2. SOAP Header 处理
可以通过拦截器或直接在服务方法中读取和处理 SOAP Header。
3. 文件/附件传输(MTOM)
XFire 支持 SOAP Attachment,可以用于传输图片、文件等二进制数据。
四、客户端开发
1. 生成客户端代码
可以用 XFire 的工具或 wsdl2java 工具自动生成客户端 stub 类。
命令示例:
wsdl2java -o src -p com.example.client http://localhost:8080/你的项目名/services/HelloService?wsdl
2. 动态调用
除了静态 stub,还可以用 XFire 的动态调用 API:
Service service = new ObjectServiceFactory().create(HelloService.class);
HelloService client = (HelloService) new XFireProxyFactory().create(service, "http://localhost:8080/你的项目名/services/HelloService");
String result = client.sayHello("World");
五、常见问题与解决
-
WSDL 无法访问
检查 servlet 映射、服务名称是否一致,确保 services.xml 路径正确。 -
序列化异常
检查 POJO 是否标准 JavaBean,是否有无参构造方法、getter/setter。 -
依赖冲突
XFire 有些 jar 包可能与 Spring、Axis 等冲突,建议使用官方推荐版本。 -
安全认证
可通过拦截器实现用户名密码校验,也可以集成 Spring Security。
六、XFire 高级应用场景
1. 服务端安全机制
-
简单用户名密码认证
可以通过自定义拦截器(Handler)在请求进入服务前进行认证。例如:public class AuthHandler extends AbstractHandler { public void invoke(MessageContext context) throws Exception { String username = context.getInMessage().getHeader("username"); String password = context.getInMessage().getHeader("password"); if (!"admin".equals(username) || !"123456".equals(password)) { throw new XFireFault("认证失败", XFireFault.SENDER); } } }然后在
services.xml中配置:<inHandlers> <handler> <handlerClass>com.example.AuthHandler</handlerClass> </handler> </inHandlers> -
集成HTTPS
在Tomcat等容器中配置SSL证书,XFire服务即可通过HTTPS安全访问。
2. 复杂数据类型的传输
-
自定义对象
只需保证对象是标准JavaBean,XFire会自动完成XML序列化/反序列化。public class User { private String name; private int age; // getter、setter、无参构造方法 }服务接口:
public User getUserInfo(String userId); -
List/Array传输
方法参数和返回值可以直接使用List<User>或User[],XFire会自动处理。
3. 日志与调试
-
开启SOAP消息日志
可以通过XFire的内置日志拦截器,或者自定义拦截器打印请求和响应内容,便于调试。public class LogHandler extends AbstractHandler { public void invoke(MessageContext context) throws Exception { System.out.println(context.getInMessage().getBody()); } }
4. 多服务部署与版本管理
- 在同一个项目下可以部署多个服务,只需在
services.xml中添加多个<service>节点即可。 - 可以通过命名空间或URL路径区分不同版本的服务。
七、常见问题解决
1. 服务找不到/404错误
- 检查
web.xml中Servlet映射和services.xml路径是否正确。 - 检查服务名称和访问URL是否一致。
2. WSDL生成异常
- 检查服务类和接口是否都能被正确加载。
- 检查POJO是否为标准JavaBean。
3. 中文乱码问题
- 可在web.xml中配置编码过滤器,或在服务端/客户端设置消息编码为UTF-8。
4. 依赖冲突
- 尽量使用XFire官方推荐的依赖版本,避免与Spring、Axis等其他框架的jar包版本冲突。
八、迁移建议
XFire项目已经多年不再维护,建议新项目优先选用JAX-WS、Spring Web Services、Apache CXF等现代Web Service框架。如果是维护老项目,可以考虑逐步迁移:
- CXF兼容XFire的API,迁移相对容易。
- 新增功能建议直接用CXF或Spring WS实现。
九、参考示例代码结构
src/
└─ com/
└─ example/
├─ service/
│ ├─ HelloService.java
│ └─ HelloServiceImpl.java
├─ handler/
│ └─ AuthHandler.java
└─ model/
└─ User.java
web/
└─ WEB-INF/
├─ web.xml
└─ xfire/
└─ services.xml
1760

被折叠的 条评论
为什么被折叠?



