2009-10-28 71 views
2

所以我想讓我的Apache xmlrpc客戶端/服務器實現玩球。一切工作正常,除了一個關鍵問題:Apache的Java XMLRPC庫問題

我的處理程序類(通過屬性文件org.apache.xmlrpc.webserver.XmlRpcServlet.properties映射)作出反應,因爲它應該但它的構造函數在每個方法調用時調用。看起來處理程序類在每次調用時都是實例化的,因爲我有數據存儲在實例變量中,我需要在調用之間進行保存。

如何保存對實例化處理程序的引用,以便可以訪問它的實例變量?

+0

你真的想/需要使用XmlRpc嗎?這是嚴重的老。 – skaffman 2009-10-30 10:58:07

+0

在這一點上,我正在做他們在學校告訴我的東西;)所以你會建議拋擲XMLRPC並在JAX-RPC中寫同樣的東西? – 2009-11-03 18:31:20

+0

JAX-RPC和XML-RPC都已過時。 JAX-WS和其他現代框架就是它的所在。 – skaffman 2010-03-23 10:34:18

回答

0

也許與javax.xml.rpc.session.maintain設置爲true?

+0

從我收集你的評論之後googleing你收集的是,這是一個JAX-RPC特定的技術?我想我可以考慮將我的所有代碼從Apache XML-RPC移到JAX-RPC,但街上的字是JAX-RPC更復雜。這是一個正確的評估? – 2009-10-30 10:48:04

1

所以,對於其他人誰希望繼續使用XMLRPC這裏就是我如何修復了這個問題:

http://xmlrpc.sourceforge.net/

遠遠優於阿帕奇xmlrpc的,在我看來。

1

這是Apache XMLRPC 3.x的標準行爲。 http://ws.apache.org/xmlrpc/handlerCreation.html

默認情況下,Apache的XML-RPC來處理每個 請求創建一個新對象在服務器側接收到。

但是,您可以模擬XMLRPC 2.x的行爲,其中使用RequestProcessorFactoryFactory註冊處理程序對象而不是處理程序類。我已經編寫了一個可以使用的自定義RequestProcessorFactoryFactory:

public class CustomHandler implements RequestProcessorFactoryFactory { 

    Map<Class<?>, RequestProcessorFactory> handlers = 
    Collections.synchronizedMap(
     new HashMap<Class<?>, RequestProcessorFactory>()); 

    @Override 
    public RequestProcessorFactory getRequestProcessorFactory(Class pClass) 
     throws XmlRpcException { 
    return handlers.get(pClass); 
    } 

    public void addHandler(final Object handler) { 
    handlers.put(handler.getClass(), new RequestProcessorFactory() { 
     @Override 
     public Object getRequestProcessor(XmlRpcRequest pRequest) 
      throws XmlRpcException { 
     return handler; 
     } 
    }); 
    } 

} 

然後,可以將其與例如像這樣的XMLRPC WebServer

WebServer server = ... 
    PropertyHandlerMapping phm = new PropertyHandlerMapping(); 
    server.getXmlRpcServer().setHandlerMapping(phm); 
    Custom sh = new CustomHandler(); 
    phm.setRequestProcessorFactoryFactory(sh); 
    Object handler = ... /** The object you want to expose via XMLRPC */ 
    sh.addHandler(handler); 
    phm.addHandler(serverName, handler.getClass()); 
+0

謝謝你的男人。你爲我節省了很多時間! – Dime 2017-02-21 13:58:01