传递/返回我们自己的类型

时间:2011-10-19 16:01:23

标签: java rmi

运行时我收到此错误:

java MyRemoteClient

java.lang.ClassCastException: $Proxy2 cannot be cast to Account
    `enter code here`at MyRemoteImpl_Stub.addAccount(Unknown Source)
    at MyRemoteClient.main(MyRemoteClient.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:271)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.dynamicjava.symbol.JavaClass$JavaMethod.evaluate(JavaClass.java:362)
    at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.handleMethodCall(ExpressionEvaluator.java:92)
    at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.visit(ExpressionEvaluator.java:84)
    at koala.dynamicjava.tree.StaticMethodCall.acceptVisitor(StaticMethodCall.java:121)
    at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.value(ExpressionEvaluator.java:38)
    at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.value(ExpressionEvaluator.java:37)
    at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:106)
    at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:29)
    at koala.dynamicjava.tree.ExpressionStatement.acceptVisitor(ExpressionStatement.java:101)
    at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.evaluateSequence(StatementEvaluator.java:66)
    at edu.rice.cs.dynamicjava.interpreter.Interpreter.evaluate(Interpreter.java:77)
    at edu.rice.cs.dynamicjava.interpreter.Interpreter.interpret(Interpreter.java:47)
    at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:246)
    at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:220)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
    at sun.rmi.transport.Transport$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
>

我做了一个类似的程序,使用基元和字符串作为参数或返回类型,它工作正常,例如,

public String sayHello() throws RemoteException;

但是类似

public Greet sayHello(Job j) throws RemoteException;

将无法运行并产生如上所述的错误。

我尝试使用所有类实现[b] Serializable [/ b],但我仍然遇到此错误。

以下是所有代码:

AccountInterface.java

import java.rmi.*;

public interface AccountInterface extends Remote {
  public float deposit(float amt) throws RemoteException;
  public float withdrawal(float amt) throws RemoteException;
  public String checkBalance() throws RemoteException;
  public String accDetails() throws RemoteException;
}

[/代码]

Account.java

import java.rmi.*;
import java.rmi.server.*;
import java.io.Serializable;

public class Account extends UnicastRemoteObject implements AccountInterface, Serializable{
private static int nextId = 0;
public int accNumber;
private String name;
private String address;
private float balance;

public Account(String n, String a, float b) throws RemoteException{
accNumber = ++nextId;
name = n;
address= a;
balance= b;
}

  public float deposit(float amt) throws RemoteException {
  balance += amt;
  return balance;
}

public float withdrawal(float amt) throws RemoteException {
  balance -= amt;
  return balance;
}

public String checkBalance() throws RemoteException{
  return (String.format("Balance=Rs.%,.2f\n", balance));
}

public String accDetails() throws RemoteException{

String s = String.format("Name=%s, Address=%s\n",
                         name, address);
return s;
 }
}

MyRemote.java

 import java.rmi.*;

    public interface MyRemote extends Remote {
     public Account addAccount(String n, String a, float b) throws RemoteException;
     public int getTotalAccount() throws RemoteException;
     public Account getObject(int id) throws RemoteException;
     public String deleteAccount(int id) throws RemoteException;
    }

MyRemoteImpl.java
    import java.rmi.*;
    import java.rmi.server.*;
    import java.util.*;
    import java.io.Serializable;

    public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote, Serializable {
    private  ArrayList<Account> acct = new ArrayList<Account>();

    public Account addAccount(String n, String a, float b) throws RemoteException{
    Account acc = null;
    try {
      acc = new Account(n,a,b);
      acct.add(acc);
    } catch(Exception ex) {ex.printStackTrace();}

    return acc;
   }

   public int getTotalAccount()  throws RemoteException{
    return acct.size();
   }

   public Account getObject(int id) {

    try {
      for (Account a : acct) {
        if (a.accNumber == id) return a;
      }
    } catch(Exception ex) {ex.printStackTrace();}
    return null;

   }

   public String deleteAccount(int id)  throws RemoteException{
    int index = -1;

    try {
      for (Account a : acct) {
        index++;
        if (a.accNumber == id) break;
      }
    } catch(Exception ex) {ex.printStackTrace();}
    acct.remove(index);
    return "Account deleted.";
   }


   public MyRemoteImpl() throws RemoteException { }

   public static void main (String[] args) {
    try {
      MyRemote service = new MyRemoteImpl();
      Naming.rebind("AccountDirectory", service);
    } catch(Exception ex) {
      ex.printStackTrace();
     }
   }
   }

MyRemoteClient.java

     import java.rmi.*;
     import java.util.*;
     import java.io.Serializable;

     public class MyRemoteClient implements Serializable {
     public static void main (String[] args) {

     try {
      MyRemote service = (MyRemote) Naming.lookup("rmi://127.0.0.1/AccountDirectory");

      Account a = (Account) service.addAccount("John", "Texas", 20000); //Dnt know if this is good, tryinh to cast it to Account 
      Account b = (Account) service.addAccount("Paul", "California", 35000);
      Account temp = service.getObject(1);
      temp.deposit(1000);
      temp.withdrawal(1000);
      System.out.println(temp.accDetails());

    } catch(Exception ex) {
      ex.printStackTrace();
    }
    }
   }

任何解决方案?感谢

2 个答案:

答案 0 :(得分:0)

您的域对象应该只实现Serializable,仅此而已:

public class Account implements Serializable

RMI完全能够编组/解组任何可序列化的Java对象(如基元或String)。

答案 1 :(得分:0)

我设法让它发挥作用。我完全删除了AccountInterface,因为它存在于服务器本身内部,客户端不会直接与它交互。谢谢!

相关问题