设为首页收藏本站
开启辅助访问
切换到宽版

创星网络[分享知识 传递快乐]

 找回密码
 立即注册

QQ登录

只需一步,快速开始

用新浪微博登录

只需一步,快速搞定

搜索
查看: 3784|回复: 0
打印 上一主题 下一主题

Apache xml-rpc与spring的整合

[复制链接]

我玩的应用:

跳转到指定楼层
楼主
发表于 2012-12-12 22:37:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前在项目中使用了Apache xml-rpc,遇到了一个麻烦的问题。spring没有提供对xml-rpc的支持,在处理webservice请求的时候,没有办法使用spring容器中管理的各种各样的bean对象。显然,这是不能接受的。

  使用Apache xml-rpc,一般只需要在web.xml中定义一个servlet (XmlRpcServlet), 再实现用于处理webservice请求的组件类就可以了。
  比如定义一个Servlet:
  1. <servlet>
  2.         <servlet-name>XmlRpcServlet</servlet-name>
  3.         <servlet-class>org.apache.xmlrpc.webserver.XmlRpcServlet</servlet-class>
  4.         <init-param>
  5.                 <param-name>enabledForExtensions</param-name>
  6.                 <param-value>true</param-value>
  7.         </init-param>
  8. </servlet>
复制代码
实现处理webservice请求的组件:
  1. public class Calculator
  2. {
  3.         public int add(int i1, int i2)
  4.         {
  5.                 return i1 + i2;
  6.         }
  7. }
复制代码
除此之外,还需要定义一个property文件,告诉xml-rpc,在请求来了以后,用哪个组件去处理。这个property文件必须命名为XmlRpcServlet.properties,并且必须放到org.apache.xmlrpc.webserver包下面。
  1. Calculator=com.oyl.Calculator
复制代码
这样,当webservice收到请求后,就会初始化一个新的组件对象去处理请求。这样,新的问题也来了,一般的web应用程序都使用spring来管理各个业务组件,通过上面的例子不难发现,我们没有办法使用spring管理的bean去处理webservice的请求,每次都初始化一个新的对象去处理请求,也会造成资源的浪费。
  那么,怎么才能在xml-rpc中使用spring管理的bean去处理webservice的请求呢?
  首先,要实现一个接口org.apache.xmlrpc.server.RequestProcessorFactoryFactory,这个接口类定义了如何创建对象去处理webservice请求:
  1. public class CustomRequestProcessorFactoryFactory implements
  2.         RequestProcessorFactoryFactory
  3. {
  4.     private final RequestProcessorFactory factory = new CustomRequestProcessorFactory();
  5.     private final CustomWebServiceHandler service;


  6.     public CustomRequestProcessorFactoryFactory(CustomWebServiceHandler service)
  7.     {
  8.         this.service = service;
  9.     }


  10.     @Override
  11.     public RequestProcessorFactory getRequestProcessorFactory(Class arg0)
  12.             throws XmlRpcException
  13.     {
  14.         return factory;
  15.     }

  16.     private class CustomRequestProcessorFactory implements
  17.             RequestProcessorFactory
  18.     {

  19.         @Override
  20.         public Object getRequestProcessor(XmlRpcRequest arg0)
  21.                 throws XmlRpcException
  22.         {
  23.             return service;
  24.         }

  25.     }
  26. }
复制代码
仔细看代码会发现,接口org.apache.xmlrpc.server.RequestProcessorFactoryFactory实际上就是一个工厂的工厂,它是一个用于创建处理webservice请求对象的工厂的工厂类。在上面的例子中,创建webservice请求对象的工厂类是一个实现了RequestProcessorFactory接口的内部类,它主要是返回我们真正需要用来处理请求的CustomWebServiceHandler对象。
  有了上面这个工厂的工厂类,我们还需要扩展一下默认的XmlRpcServlet。主要是实现newXmlRpcHandlerMapping方法,在newXmlRpcHandlerMapping方法中,把需要用到的spring bean对象取出来,再作为参数创建一个RequestProcessorFactoryFactory对象,就可以达到目的了。
  1. public class CustomXmlRpcServlet extends XmlRpcServlet
  2. {
  3.     private static final long serialVersionUID = 8615627610262194L;
  4.     protected static ApplicationContext ctx = null;

  5.     public CustomXmlRpcServlet()
  6.     {
  7.         super();
  8.     }


  9.     public void init()
  10.     {
  11.         if (ctx == null)
  12.         {
  13.             ctx = WebApplicationContextUtils
  14.                     .getRequiredWebApplicationContext(this.getServletContext());
  15.         }
  16.     }


  17.     protected XmlRpcHandlerMapping newXmlRpcHandlerMapping()
  18.             throws XmlRpcException
  19.     {
  20.         PropertyHandlerMapping mapping = new PropertyHandlerMapping();
  21.         
  22.         CustomWebServiceHandler service = (CustomWebServiceHandler) ctx.getBean("customWebServiceHandler");
  23.         
  24.         mapping.setRequestProcessorFactoryFactory(new CustomRequestProcessorFactoryFactory(service));
  25.         mapping.addHandler("CustomWebServiceHandler", CustomWebServiceHandler.class);

  26.         return mapping;
  27.     }
  28. }
复制代码
这样扩展以后,之前提到的XmlRpcServlet.properties文件也不再需要了。  

from:http://go.cxweb.com.cn/254ua
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|创星网络 ( 苏ICP备11027519号|网站地图  

GMT+8, 2024-5-17 09:54 , Processed in 0.081795 second(s), 26 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表