将RMI与JSF和Tomcat一起使用

时间:2014-12-24 18:29:36

标签: java tomcat rmi

我想用RMI编写一个简单的应用程序。在服务器端,我有一个接口f​​oo和一个类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的Web应用程序,它在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:错误解组返回;嵌套   异常是:java.lang.ClassNotFoundException:Foo(没有安全性   经理:禁用RMI类加载器)   sun.rmi.registry.RegistryImpl_Stub.lookup(未知来源)at   java.rmi.Naming.lookup(Naming.java:101)at   bean.IndexBean.execute(IndexBean.java:15)at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:606)at   org.apache.el.parser.AstValue.invoke(AstValue.java:245)at at   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)at   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)at   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)     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)     ... 44更多

另外,我更改了Tomcat使用的端口与RMI端口没有冲突。

1 个答案:

答案 0 :(得分:1)

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

super(0);

作为构造函数的第一行。

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

相关问题