Проблема путей пакетов в RMI

207
21 сентября 2017, 14:34

Представим, что у нас есть два приложения. Они имеют разные пакеты. И вообще находятся на разных хостах.

Класс клиента.

package rmi;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client {
    public static void main(String[] args) throws Exception {
        Registry registry = LocateRegistry.getRegistry("192.168.0.102", 1099);
        ServerRemote remote = (ServerRemote) registry.lookup("Server");
        remote.doSomthing();
    }
}

Класс Сервера.

package rmiAnother;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
public class Server implements ServerRemote{
    public static void main(String[] args) throws Exception {
            Registry registry = LocateRegistry.createRegistry(1099);
            ServerRemote stub = (ServerRemote) UnicastRemoteObject.exportObject(new Server(), 1099);
            registry.bind("Server", stub);
            while(true){
                System.out.println("Ждем...");
                Thread.sleep(Integer.MAX_VALUE);
            }
    }
    @Override
    public boolean doSomething() throws RemoteException {
        return false;
    }
}

Классы интерфейсов.

package rmiAnother;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ServerRemote extends Remote {
    boolean doSomething() throws RemoteException;
}
package rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ServerRemote extends Remote {
    boolean doSomething() throws RemoteException;
}

При выполнении данного кода, выбьет ошибку.

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to rmi.ServerRemote
    at rmi.Client.main(Client.java:10)

Связана она, с невозможностью скастовать объект, к новому интерфейсу. Т.к при бинде, использовался интерфейс пакета rmiAnother. А в клиенте, при .lookup() пытается скастовать к интерфейсу, из пакета rmi.

Теперь сам вопрос, можно ли в RMI на стороне клиента, адаптировать полученный объект, к абсолютно идентичному интерфейсу, но из другого пакета?

Просто делать dependency клиента от сервера, нет возможности. Поэтому я тут вижу только вариант, просто изменить classpath к интерфейсу на стороне клиента. Да бы оно совпадало, с classpath на стороне сервера. Но это не очень красиво выглядит. Когда все аккуратно было складировано по пакетам в клиенте, и появляется левый пакет, содержащий в себе пару интерфейсов для RMI с путями как на сервере.

READ ALSO
Авторизация в OAuth + Google + scribejava

Авторизация в OAuth + Google + scribejava

Все прикрутил и пример вставил, даже реализовал веб-проектНо все время возвращает body=null

217
Как реализовать Fragment.onAttach() в адаптере (RecyclerView.Adapter)

Как реализовать Fragment.onAttach() в адаптере (RecyclerView.Adapter)

Разрабатывается приложение, в котором используются фрагментыПытаюсь реализовать смену фрагмента по нажатию на любой item в recyclerView

207
Immutable объект в Java

Immutable объект в Java

В java все объект могут быть mutable и immutableПонятно, что, например, строка является immutable

237
Java Bean Не инжектит бины

Java Bean Не инжектит бины

Здравствуйте! Второй день пытаюсь пофиксить проблемуВ проекте пытаюсь достать данные из базы, но вылетает NullPointerException

186