我想用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的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端口没有冲突。
答案 0 :(得分:1)
客户端的CLASSPATH上没有远程接口,或者也可能是存根。要避免使用存根,请添加
super(0);
作为构造函数的第一行。
注意,您必须将createRegistry()
的结果存储在静态变量中,以防止注册表退出。