【发布时间】:2020-04-04 19:04:38
【问题描述】:
我需要使用 RMI 为客户发送用药计划。服务器和客户端在不同的项目中,都定义了这些类(实体和远程接口):
public class Plan implements Serializable {
private Integer id;
private Date periodStart;
private Date periodEnd;
private Integer patientId;
private Medication medications;
}
public class Medication implements Serializable {
private Integer id;
private String name;
private Integer dosage;
private Integer intakeInterval;
}
public interface PillService extends Remote {
public Plan getPlan(int id) throws RemoteException;
}
上面的代码可以正常工作,但我需要在Plan 中有一个药物列表,如下所示:
public class Plan implements Serializable {
...
private List<Medication> medications;
}
如果我使用这个 Plan 类运行,我会得到这个异常:
Client exception: java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: org.hibernate.collection.internal.PersistentBag (no security manager: RMI class loader disabled)
在此之后我将SecutiryManager 添加到System 我得到错误:
java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
因此,在 Plan 中没有 List<Medication> 时它可以正常工作。 RMI 不喜欢复合对象吗?我应该定义一个新的远程方法来单独获取药物列表吗?
【问题讨论】:
-
类
org.hibernate.collection.internal.PersistentBag需要在客户端可用。
标签: java serialization rmi