Apache的Java XMLRPC库存在问题

时间:2009-10-28 12:20:06

标签: java xml-rpc

所以我试图让我的Apache xmlrpc客户端/服务器实现来玩球。除了一个关键问题外,一切正常:

我的处理程序类(通过属性文件org.apache.xmlrpc.webserver.XmlRpcServlet.properties映射)应该响应,但它的构造函数在每次方法调用时都会被调用。似乎处理程序类在每次调用时都被实例化,这是不好的,因为我有数据存储在我需要在调用之间保存的实例变量中。

如何保存对实例化处理程序的引用,以便我可以访问它的实例变量?

3 个答案:

答案 0 :(得分:1)

所以,对于那些仍然想要使用XMLRPC的人来说,我是如何解决这个问题的:

http://xmlrpc.sourceforge.net/

在我看来,

远远优于apache xmlrpc。

答案 1 :(得分:1)

这是Apache XMLRPC 3.x的标准行为。 http://ws.apache.org/xmlrpc/handlerCreation.html

  

默认情况下,Apache XML-RPC会创建一个新对象来处理每个对象   在服务器端收到的请求。

但是,您可以使用RequestProcessorFactoryFactory模拟XMLRPC 2.x的行为,其中您注册了处理程序对象而不是处理程序类。我编写了一个可以使用的自定义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());

答案 2 :(得分:0)

也许与javax.xml.rpc.session.maintain设置为true有关?