Использование RMI с JSF и Tomcat

1

Я хочу написать простое приложение, использующее RMI. На стороне сервера у меня есть интерфейс foo и класс fooImpl. Мой интерфейс:

import java.rmi.Remote;

public interface Foo extends Remote {
   public String exec(String test) throws Exception;
}

Моя реализация интерфейса выше:

import java.rmi.server.UnicastRemoteObject;

public class FooImpl extends UnicastRemoteObject implements Foo {

    public FooImpl() throws Exception {
        java.rmi.registry.LocateRegistry.createRegistry(1099);
        java.rmi.Naming.rebind("myFoo",this);
    }

    public String exec(String test) {
        return "This is a Test";
    }

    public static void main(String[] args) {
        try {
            FooImpl fooImpl = new FooImpl();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

На стороне клиента у меня есть веб-приложение с использованием PrimeFace, который запущен на Tomcat. На стороне клиента есть IndexBean:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

@ManagedBean
@RequestScoped
public class IndexBean {

    public void execute() {
        try {
            Foo foo = (Foo) java.rmi.Naming.lookup("//localhost/myFoo");
            System.out.println(foo.exec());
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

}

когда я выполняю код, я получаю следующую ошибку на стороне клиента:

java.rmi.UnmarshalException: ошибка unmarshalling return; Вложенное исключение: java.lang.ClassNotFoundException: Foo (нет менеджера безопасности: загрузчик классов RMI отключен) на sun.rmi.registry.RegistryImpl_Stub.lookup (Неизвестный источник) в java.rmi.Naming.lookup(Naming.java:101) на bean.IndexBean.execute(IndexBean.java:15) на sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) на sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) на sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43) в java.lang.reflect.Method.invoke(Method.java:606) в org.apache.el.parser.AstValue.invoke(AstValue.java:245) в org.apache.el.MethodExpressionImpl. invoke (MethodExpressionImpl.java:277) в org.apache.myfaces.view.facelets.el.ContextAwareTagMethodExpression.invoke(ContextAwareTagMethodExpression.java:96) в javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:88) в javax.faces.event.ActionEvent.processListener(ActionEvent.java:51) в javax.faces.component.UIC omponentBase.broadcast(UIComponentBase.java:409) в javax.faces.component.UICommand.broadcast(UICommand.java:103) в javax.faces.component.UIViewRoot._broadcastAll (UIViewRoot.java:1013) в javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:284) в javax.faces.component.UIViewRoot._process (UIViewRoot.java:1302) в javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:745) в org.apache. myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:38) в org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:170) в org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java: 117) в javax.faces.webapp.FacesServlet.service(FacesServlet.java:197) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) в org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) на org.apache.catalina.core.StandardWrapperValve.invoke( StandardWrapperValve.java:219) в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) в org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610 ) на org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) на org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) на org.apache.coyote.http11.AbstractHttp11Processor. процесс (AbstractHttp11Processor.java:1081) на org.apache.coyote.AbstractPro tocol $ AbstractConnectionHandler.process(AbstractProtocol.java:658) на org.apache.coyote.http11.Http11NioProtocol $ Http11ConnectionHandler.process(Http11NioProtocol.java:222) на org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun( NioEndpoint.java:1566) на org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java:1523) на java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) на java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) в org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61) в java.lang.Thread.run(Thread.java: 744) Вызвано: java.lang.ClassNotFoundException: Foo (нет менеджера безопасности: загрузчик классов RMI отключен) на sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:553) на java.rmi.server.RMIClassLoader $ 2. loadProxyClass (RMIClassLoader.java:646) в java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311) на sun.rmi.server.MarshalInputStream.resolv eProxyClass (MarshalInputStream.java:255) в java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1558) в java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514) в java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java: 1771) в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1350) в java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)... еще 44

Кроме того, я изменил порт, который использует Tomcat, чтобы не иметь конфликта с портом RMI.

  • 0
    Эта проблема больше касается Java и RMI. JSF не имеет отношения к этой проблеме.
Теги:
tomcat
rmi

1 ответ

1

У клиента нет удаленного интерфейса на CLASSPATH или, возможно, на заглушке. Чтобы избежать использования заглушки, добавьте

super(0);

как первая строка конструктора.

NB вы должны сохранить результат createRegistry() в статической переменной, чтобы предотвратить выход из реестра.

  • 0
    У клиента тоже есть интерфейс Foo. Я также создал jar-файл из интерфейса Foo и поместил его в папку lib в WEB-INF, но изменений не было. Я добавил "супер (0);" конструктору FooImpl, но ничего не изменилось.
  • 0
    У клиента нет Foo . Исключение говорит так.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню