歡迎您光臨本站 註冊首頁

Apache xml-rpc與spring的整合

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

  在項目中使用了Apache xml-rpc,遇到了一個麻煩的問題。spring沒有提供對xml-rpc的支持,在處理webservice請求的時候,沒有辦法使用spring容器中管理的各種各樣的bean對象。顯然,這是不能接受的。

  使用Apache xml-rpc,一般只需要在web.xml中定義一個servlet (XmlRpcServlet), 再實現用於處理webservice請求的組件類就可以了。

  比如定義一個Servlet:

  1. <servlet>  
  2.     <servlet-name>XmlRpcServletservlet-name>  
  3.     <servlet-class>org.apache.xmlrpc.webserver.XmlRpcServletservlet-class>  
  4.     <init-param>  
  5.         <param-name>enabledForExtensionsparam-name>  
  6.         <param-value>trueparam-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包下面。

Properties代碼

Calculator=com.oyl.Calculator  

  這樣,當webservice收到請求后,就會初始化一個新的組件對象去處理請求。這樣,新的問題也來了,一般的web應用程序都使用spring來管理各個業務組件,通過上面的例子不難發現,www.linuxidc.com 我們沒有辦法使用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.   
  7.   
  8.     public CustomRequestProcessorFactoryFactory(CustomWebServiceHandler service)   
  9.     {   
  10.         this.service = service;   
  11.     }   
  12.   
  13.   
  14.     @Override  
  15.     public RequestProcessorFactory getRequestProcessorFactory(Class arg0)   
  16.             throws XmlRpcException   
  17.     {   
  18.         return factory;   
  19.     }   
  20.   
  21.     private class CustomRequestProcessorFactory implements  
  22.             RequestProcessorFactory   
  23.     {   
  24.   
  25.         @Override  
  26.         public Object getRequestProcessor(XmlRpcRequest arg0)   
  27.                 throws XmlRpcException   
  28.         {   
  29.             return service;   
  30.         }   
  31.   
  32.     }   
  33. }  

  仔細看代碼會發現,介面org.apache.xmlrpc.server.RequestProcessorFactoryFactory實際上就是一個工廠的工廠,它是一個用於創建處理webservice請求對象的工廠的工廠類。在上面的例子中,創建webservice請求對象的工廠類是一個實現了RequestProcessorFactory介面的內部類,它主要是返回我們真正需要用來處理請求的CustomWebServiceHandler對象。

  有了上面這個工廠的工廠類,我們還需要擴展一下默認的XmlRpcServlet。主要是實現newXmlRpcHandlerMapping方法,在newXmlRpcHandlerMapping方法中,把需要用到的spring bean對象取出來,www.linuxidc.com再作為參數創建一個RequestProcessorFactoryFactory對象,就可以達到目的了。

  1. public class CustomXmlRpcServlet extends XmlRpcServlet   
  2. {   
  3.     private static final long serialVersionUID = 8615627610262194L;   
  4.     protected static ApplicationContext ctx = null;   
  5.   
  6.     public CustomXmlRpcServlet()   
  7.     {   
  8.         super();   
  9.     }   
  10.   
  11.   
  12.     public void init()   
  13.     {   
  14.         if (ctx == null)   
  15.         {   
  16.             ctx = WebApplicationContextUtils   
  17.                     .getRequiredWebApplicationContext(this.getServletContext());   
  18.         }   
  19.     }   
  20.   
  21.   
  22.     protected XmlRpcHandlerMapping newXmlRpcHandlerMapping()   
  23.             throws XmlRpcException   
  24.     {   
  25.         PropertyHandlerMapping mapping = new PropertyHandlerMapping();   
  26.            
  27.         CustomWebServiceHandler service = (CustomWebServiceHandler) ctx.getBean("customWebServiceHandler");   
  28.            
  29.         mapping.setRequestProcessorFactoryFactory(new CustomRequestProcessorFactoryFactory(service));   
  30.         mapping.addHandler("CustomWebServiceHandler", CustomWebServiceHandler.class);   
  31.   
  32.         return mapping;   
  33.     }   
  34. }  

這樣擴展以後,之前提到的XmlRpcServlet.properties文件也不再需要了。



[火星人 ] Apache xml-rpc與spring的整合已經有479次圍觀

http://coctec.com/docs/program/show-post-71491.html