【发布时间】: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 与这个问题无关。