gpt4 book ai didi

Java RMI 客户端尝试加载实现而不是接口(interface)

转载 作者:行者123 更新时间:2023-12-01 11:54:45 24 4
gpt4 key购买 nike

我对 RMI 客户端类加载行为有疑问:

我的 RMI 服务器端应用程序使用单个方法导出 ISessionFactory 对象:

ISessionToken createSession(String username, String password) throw RemoteException;

ISessionFactory 扩展了 RemoteISessionTokenSerializeable

我有三个项目:客户端、服务器(包含 *Impl)和 Facade(包含 ISession*)。

服务器启动正常,我可以查找 ISessionFactory。出于测试目的,我添加了一个 doSomething 方法,该方法通过服务器端的 System.out 打印出一个字符串,这也可以正常工作。然而,对 createSession() 的调用不会,但会给出异常:

Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: rmiserver.SessionTokenImpl (no security manager: RMI class loader disabled)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:198)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
at com.sun.proxy.$Proxy0.createSession(Unknown Source)
at rmiclient.Client.main(Client.java:14)
Caused by: java.lang.ClassNotFoundException:
rmiserver.SessionTokenImpl (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:396)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:186)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264)
at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:214)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:326)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:175)
... 4 more

我知道,如果不导出 ISessionToken ,它将被序列化并传递给客户端,因此我必须验证传递给服务器的每个 session token 。

我不明白的是,客户端感觉需要加载 token 的Impl类。就我而言,通过了解接口(interface)应该可以做得很好?我错过了什么?

最佳答案

I understand that without export of ISessionToken it will be serialized and passed to the client.

正确。

What I don't understand is that the client feels the need to load the Impl class of the token.

因为你没有导出它,所以它会被序列化并传递给客户端。你自己也这么说的。

As far as I am concerned it should be doing fine by knowing the interface?

仅当您导出它时。即使这样,客户端实际上也会收到一个实现接口(interface)的 stub 。您不能只发送一个接口(interface)而没有实现它的东西。

What am I missing?

您没有导出它。

关于Java RMI 客户端尝试加载实现而不是接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28531232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com