В XmlRpc Метод AddHandler класса WebServer в JAVA устарел, какова другая альтернатива для этого метода?

#java #server #client #xml-rpc

#java #сервер #клиент #xml-rpc

Вопрос:

Я знаю, что этот вопрос уже задавался.В ранее задаваемых вопросах есть ссылка, по которой мы можем найти подробную информацию об org.apache.xmlrpc, но я не могу определить альтернативу для метода AddHandler класса WebServer.

У меня есть два проекта

     1    Server
            Server project consist of
                1.1 AreaServer
                1.2 AreaHandler
    2   Client
            Client project consist of
        2.1 Client
        
  

Класс AreaHandler изменяет площадь окружности для заданного радиуса.
AreaServer использует класс AreaHandler.

AreaServer

 package webtutorial;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.xmlrpc.webserver.WebServer;

/**
 *
 * @author Dev Parzival
 */
public class AreaServer {
    public static void main(String $[]){
        try {
            startServer($);
        } catch (IOException ex) {
            Logger.getLogger(AreaServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public static void startServer(String $[]) throws IOException{
        WebServer server;
        server=new WebServer(Integer.parseInt($[0]));
        server.addHandler("area",new AreaHandler());
        server.start();
    }
}
  

AreaHandler

 package webtutorial;

/**
 *
 * @author Dev Parzival
 */
public class AreaHandler {
    
    /**
     *
     * @param radius radius of circle whose area has to be computed
     * @return area of the circle whose type is double
     */
    public double circleArea(double radius){
        return Math.PI*radius*radius;
    }
}
  

Клиент

 package client;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;

/**
 *
 * @author Dev Parzival
 * @date   02-Sep-2020
 * @time   08:46:01
 */
public class Client {

    /**
     * @param $ the command line arguments , represent the radius of the circle whose area is to be computer via the server.
     */
    public static void main(String[] $) {
        // TODO code application logic here
        Client client=new Client();
        double radius=Double.parseDouble($[0]);
        try{
            double area=client.areaCircle(radius);
            System.out.println("Area of the circle is : " area);
        }
        catch(Exception ex){
            System.out.println(ex);
        }
    }
    public double areaCircle(double radius) throws IOException,XmlRpcException{
        double area=0;
        XmlRpcClient client=new XmlRpcClient();
        ArrayList<Double> vec=new ArrayList<Double>();
        vec.add(new Double(radius));
        Object result=client.execute("area.circleArea", vec);
        area=Double.parseDouble(result.toString());
        return area;
    }
}
  

Метод AddHandler устарел, поэтому я хочу знать, как это можно сделать

 server.addHandler("area",new AreaHandler());
  

Свяжите класс AreaHandler с area, чтобы при запросе клиента к серверу он возвращал область.

Ответ №1:

Вы все еще можете использовать устаревшие методы. Какую версию xmlrpc вы используете?

В документах указано, что вы можете использовать PropertyHandlerMapping для добавления сопоставлений из файла свойств.

       PropertyHandlerMapping phm = new PropertyHandlerMapping();
      /* Load handler definitions from a property file.
       * The property file might look like:
       *   Calculator=org.apache.xmlrpc.demo.Calculator
       *   org.apache.xmlrpc.demo.proxy.Adder=org.apache.xmlrpc.demo.proxy.AdderImpl
       */
     phm.load(Thread.currentThread().getContextClassLoader(),
               "MyHandlers.properties");
     xmlRpcServer.setHandlerMapping(phm);
  

Или вы можете добавить их напрямую:

       /* You may also provide the handler classes directly,
       * like this:
       * phm.addHandler("Calculator",
       *     org.apache.xmlrpc.demo.Calculator.class);
       * phm.addHandler(org.apache.xmlrpc.demo.proxy.Adder.class.getName(),
       *     org.apache.xmlrpc.demo.proxy.AdderImpl.class);
       */
  

Смотрите:https://ws.apache.org/xmlrpc/server.html

Вы все еще можете добавить обработчик, подобный этому:

 WebServer server = new WebServer(Integer.parseInt($[0]));
PropertyHandlerMapping handlerMapping = new PropertyHandlerMapping();
handlerMapping.addHandler("area", AreaHandler.class);
XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
xmlRpcServer.setHandlerMapping(handlerMapping);

XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
serverConfig.setEnabledForExtensions(true);
serverConfig.setContentLengthOptional(false);

server.start();
  

Комментарии:

1. версия jar — 3.1.3

2. Можете ли вы поделиться ссылкой на более старую версию файлов jar xmlrpc, чтобы она поддерживала метод AddHandler

3. Обновленный ответ, вы все равно сможете добавить обработчик, но для этого используйте класс сопоставления обработчика свойств.

4. Я получаю это исключение ошибки в потоке «main» java.lang. NoClassDefFoundError: org/apache/commons/logging/LogFactory в org.apache.xmlrpc.server.XmlRpcStreamServer. <clinit> (неизвестный источник) в org.apache.xmlrpc.webserver. WebServer.newXmlRpcStreamServer (неизвестный источник) в org.apache.xmlrpc.webserver. Веб-сервер. <инициализация> (неизвестный источник) ;

5. в этой строке: server = новый веб-сервер (Integer.parseInt($[0]));//$[0]=4404