WebService框架(三)Xfire详细配置使用

一、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.xmlweb.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");

五、常见问题与解决

  1. WSDL 无法访问
    检查 servlet 映射、服务名称是否一致,确保 services.xml 路径正确。

  2. 序列化异常
    检查 POJO 是否标准 JavaBean,是否有无参构造方法、getter/setter。

  3. 依赖冲突
    XFire 有些 jar 包可能与 Spring、Axis 等冲突,建议使用官方推荐版本。

  4. 安全认证
    可通过拦截器实现用户名密码校验,也可以集成 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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猩火燎猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值