我有2个项目。一个人在任何部门工作都很好。我下载并修改它以更好地理解它。第二个是处于开发阶段的项目。
现在,这两个项目都有几乎完全相同的RMI包,它在第一个项目中运行良好,但在第二个项目中没有。
我在每个包中的测试类基本相同。
主要区别在于尝试访问的对象,它们都是数据库包中的接口。
现在,第二个项目中的数据库包在其他方面工作得非常好,它只是不适用于RMI。
简而言之:
这是我的DBInterface
public interface DB extends Remote {
public String[] read(int recNo) throws RecordNotFoundException;
public void update(int recNo, String[] data, long lockCookie)
throws RecordNotFoundException, SecurityException, IOException;
public void delete(int recNo, long lockCookie)
throws RecordNotFoundException, SecurityException, IOException;
public int[] find(String[] criteria);
public int create(String[] data) throws DuplicateKeyException, IOException;
public long lock(int recNo) throws RecordNotFoundException;
public void unlock(int recNo, long cookie)
throws RecordNotFoundException, SecurityException;
}
这是我的RMIInterface
public interface RMIInterface extends Remote{
public DB getClient() throws RemoteException;
}
我的RMIImplementation
public class RMIImplementation extends UnicastRemoteObject
implements RMIInterface {
private static String dbLocation = null;
private DB a;
public RMIImplementation() throws RemoteException{
}
public RMIImplementation(String dbLocation) throws RemoteException{
System.out.println(dbLocation);
this.dbLocation = dbLocation;
}
public static DB getRemote(String hostname, String port)
throws RemoteException {
String url = "rmi://" + hostname + ":" + port + "/DvdMediator";
try {
RMIInterface factory
= (RMIInterface) Naming.lookup(url);
// at this point factory equals Proxy[RMIInterface,................etc
// i want the return to equal Proxy[DB,..............etc
return (DB) factory.getClient();
} catch (NotBoundException e) {
throw new RemoteException("Dvd Mediator not registered: ", e);
}
catch (java.net.MalformedURLException e) {
throw new RemoteException("cannot connect to " + hostname, e);
}
}
public DB getClient() throws RemoteException {
try {
a = new ContractorDatabase(dbLocation);
}
catch(Exception e){
System.out.println("NewClass exception: " + e.toString());
}
return a;
}
我的RMI注册表
public class RegDvdDatabase {
private RegDvdDatabase() {
}
public static void register()
throws RemoteException {
register(".", java.rmi.registry.Registry.REGISTRY_PORT);
}
public static void register(String dbLocation, int rmiPort)
throws RemoteException {
Registry r = java.rmi.registry.LocateRegistry.createRegistry(rmiPort);
r.rebind("DvdMediator", new RMIImplementation(dbLocation));
}
}
让这两个一起工作会抛出一个
Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to sjdproject.remote.RMIImplementation
请你帮我找一个阻止它工作的数据库问题。
答案 0 :(得分:0)
您必须将其投射到远程接口。
编辑服务器代码中的注册表引用r
必须是静态的。我看不出在实现类中查找客户端查找代码的任何充分理由。该类应该只存在于服务器上,而不是客户端。
答案 1 :(得分:-1)
如果您没有调试器,我建议在提供的对象上使用反射并查看它实现的接口。它似乎是一个代理对象,因此必须实现一些接口。
for(Class clazz : factory.getClass().getInterfaces()) {
System.out.println(clazz.getSimpleName());
}
我对多个部署的怀疑当然是jvm版本和类路径。你能证实它们匹配吗?