您好,我有一个RMI应用程序,现在我尝试从客户机调用服务器上的一些方法。我有以下代码:
public static void main(final String[] args) {
try {
//Setting the security manager
System.setSecurityManager(new RMISecurityManager());
IndicatorsService server = (IndicatorsService) Naming
.lookup("rmi://localhost/" + IndicatorsService.SERVICE_NAME);
DataProvider provider = new OHLCProvider(server);
server.registerOHLCProvider(provider);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
服务器已正确加载,但当我尝试调用server.registerOHLCProvider(provider);
时,收到以下错误:
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: sk.xorty.client.providers.OHLCProvider (no security manager: RMI class loader disabled)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:336)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
at sk.fri.statistics.service.impl.IndicatorsServiceImpl_Stub.registerOHLCProvider(Unknown Source)
at sk.fri.statistics.service.Client.main(Client.java:61)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: sk.xorty.client.providers.OHLCProvider (no security manager: RMI class loader disabled)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:296)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassNotFoundException: sk.xorty.client.providers.OHLCProvider (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:375)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:306)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:290)
... 9 more
我已经添加了我的策略文件作为VM参数,如下所示:
grant {
permission java.security.AllPermission;
}
它一直在说一些关于禁用类加载的事情,所以我猜问题出在某个地方……谢谢!
发布于 2020-01-17 18:32:16
我想补充一些可能对一些人有帮助的东西,特别是乞讨者。我来到这里寻找上述错误的解决方案,但作为一个初学者,我不知道如何使用安全策略和指定"java.rmi.server.codebase“属性。修复该错误的最简单方法是确保要通过RMI发送的对象的类位于包的相同路径中。通过这种方式,两个应用程序都将类放在相对于其主文件夹的相同位置,错误将得到解决。
示例:如果您希望从服务器向客户端发送类型为MedicationDTO
(可序列化)的对象,请确保它位于相同的包路径中。在我的例子中,在服务器应用程序中,对象在com.example.springdemo.dto
中,而在客户端应用程序中,它在com.example.springdemo.service.dto
中。问题是,在使用IntelliJ时,因为service
包中没有任何内容,而是另一个包,所以它们的名称是连接在一起的(service.dto
),我看不出路径不同。因此,请确保您的类具有相同的包路径。(我的解决方案是:com.example.springdemo.dto
包中的两个应用程序中都必须有MedicationDTO
类。
我知道这不是最好的解决方案,这只是一个“小把戏”,但我当时会非常高兴地找到这个解决方案,因为它节省了我解决问题的大量浪费时间。
我希望这将对那些想要快速修复该错误的人有所帮助,因为我认为学习使用安全管理器和包括代码库可能有点棘手,并且需要时间。
发布于 2014-04-21 18:01:01
我知道为什么会这样。例如,您在项目A中启动服务器,但在项目B中使用客户端来请求此服务器,这是错误的。因此,您应该将服务器和客户端放在同一个项目中。
https://stackoverflow.com/questions/6322107
复制相似问题