关于spring和Xfire的整合

本文详细介绍如何将XFire WebService框架与Spring框架集成。包括修改web.xml中的XFireServlet配置,以及在ApplicationContext.xml中配置服务实现类和服务接口等关键步骤。此外,还解决了参数映射问题,并附带了解决过程中的常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上现在有很多这类文章,我看的是一知半解的。自己写一个自己看懂的作为记录。(所用的编译器是myeclipse 6.5)
做的项目是半路加的webservice,右点击项目->myeclipse->Add Xfire… 直接点击finish。这个时候就生成了WebSevice文件(这个可以不用管,因为我们这是使用spring管理的),看一下web.xml这个文件是不是生成了关于xfire的配置。如下:

 <servlet>
    <servlet-name>XFireServlet</servlet-name>
    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
    <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

这里的XFireServlet配置注意了,自动生成的是这样的,它是不在Spring 管理下的,在srping管理下我们要修改成下面这样

  <servlet>
    <servlet-name>XFireServlet</servlet-name>
    <!--  没有结合spring应用的此类,结合spring 后用的下面的类
    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
    -->
    <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

这是一个要注意的地方。
在ApplicationContext.xml的中配置如下

<!-- XFire start -->
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
    <!-- Service实现类-->
    <bean id="EqServiceImpl"
    class="com.jspwill.service.webservice.EqServiceImpl" />
    <!--这里的name属性并不是调用时的Service名字;调用时要用类名不知道为什么-->
    <bean name="IEqService" class="org.codehaus.xfire.spring.ServiceBean">
        <!-- Service实现类-->
        <property name="serviceBean" ref="EqServiceImpl" /> 
         <!-- Service接口-->
        <property name="serviceClass"   value="com.jspwill.service.webservice.IEqService" />
        <property name="inHandlers">
            <list>
                <ref bean="addressingHandler" />
            </list>
        </property>
    </bean>

    <bean id="addressingHandler" class="org.codehaus.xfire.addressing.AddressingInHandler" />
<!-- XFire end -->

这样在写接口的时候就可以直接用注解了,因为你的xfire被spring管理了。

还有一个就是在接口请求是参数会变成in0、in1…..
这个解决办法是在webservice接口同文件下创建一个 classname.aegis.xml,classname是你的接口名,我这里的接口名是IEqService,所以是IEqService.aegis.xml(一定要与webservice接口同文件下),在此文件编写如下:

<?xml version="1.0" encoding="UTF-8"?>   
<mappings>   
    <mapping>   
       <method name="getEquipmentsForBhf">   
           <parameter index="0"  mappedName="token" /> 
       </method> 

       <method name="getEquipmentById">   
           <parameter index="0"  mappedName="id" /> 
           <parameter index="1"  mappedName="token" /> 
       </method> 

   </mapping>   
</mappings> 
<method name="getEquipmentsForBhf">   这个是接口名
<parameter index="0"  mappedName="token" />  这个就是接口里所需的参数

基本就这些了,中间陪到一个问题:在applicationConentent.xml 配置的 会报找不到该文件的错误,主要是因为我一开始在web.xml没有对XFireServlet配置进行修改,修改过了就好了。

package com.xfire.core.client; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.codehaus.xfire.client.XFireProxyFactory; import org.codehaus.xfire.service.Service; import org.codehaus.xfire.service.binding.ObjectServiceFactory; import com.xfire.core.entity.UserInfo; import com.xfire.core.service.IUserInfoService; /** *@author jilongliang *@Date 2012-3-5 * */ public class UserInfoClient { public static void main(String[] args) { getServiceList(); setServiceList(); } static String url = "http://localhost:8081/xfire/services/UserInfo"; /** * */ public static void getServiceList() { Service service = new ObjectServiceFactory() .create(IUserInfoService.class); try { IUserInfoService iAddressService = (IUserInfoService) new XFireProxyFactory() .create(service, url); List list = (ArrayList) iAddressService .getAddressList(); System.out.println("一共多少条数据:" + list.size()); for (Iterator iter = list.iterator(); iter.hasNext();) { UserInfo a = iter.next(); System.out.println(a); } } catch (MalformedURLException e) { e.printStackTrace(); } } public static void setServiceList() { Service service = new ObjectServiceFactory() .create(IUserInfoService.class); try { IUserInfoService iAddressService = (IUserInfoService) new XFireProxyFactory() .create(service, url); List listAdd = new ArrayList(); UserInfo address = new UserInfo(); address.setIdentifier(1); address.setCountry("中國"); address.setProivice("廣東省"); address.setCity("陽江"); address.setAddress("廣東陽春"); address.setPostCode("1111111"); address.setExist(false); address.setArrary(new String[] { "22", "23", "24" }); listAdd.add(address); address.setIdentifier(2); address.setCountry("中國"); address.setProivice("廣東省"); address.setCity("陽江"); address.setAddress(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值