【问题标题】:Using RMI with JSF and Tomcat将 RMI 与 JSF 和 Tomcat 一起使用
【发布时间】:2015-02-22 19:27:02
【问题描述】:

我想使用 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();
        }
    }
}

在客户端,我有使用在 Tomcat 上运行的 PrimeFace 的 Web 应用程序。客户端有一个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:解组返回错误;嵌套的 例外是: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(Native Method) 在 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.UIComponentBase.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.process(AbstractHttp11Processor.java:1081) 在 org.apache.coyote.AbstractProtocol$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.resolveProxyClass(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端口不冲突。

【问题讨论】:

  • 这个问题更多是关于Java和RMI的。 JSF 与这个问题无关。

标签: java tomcat rmi


【解决方案1】:

客户端在其 CLASSPATH 上没有远程接口,或者,可能也没有存根。为避免使用存根,请添加

super(0);

作为构造函数的第一行。

注意,您必须将createRegistry() 的结果存储在静态变量中,以防止注册表退出。

【讨论】:

  • 客户端也有Foo接口。我也从 Foo 界面创建了一个 jar 文件并将其放在 WEB-INF 的 lib 文件夹中,但没有任何变化。我添加了“超级(0);”到 FooImpl 的构造函数,但没有任何改变。
  • 客户端没有Foo。例外是这样说的。
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2021-06-08
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多