Erro ao retornar dados da classe RMI

Ola !

Tenho uma classe cliente e uma classe servidora, que se comunicam via
RMI.
Estou precisando retornar o resultado de um consulta na classe servidora.

Tentei retornar o próprio ResultSet, mas ele da “error unmarshalling return”. Com um List deu certo, mas tentei popular o List com uma classe
auxiliar, e apresentou o mesmo erro:

A pergunta é:
Nestes casos, o que é normalmente utilizado ? Ou como posso popular este List sem dar o exception do RMI ?

Código da classe servidora que estou utilizando:
Cliente cl = null;
while(resultSet.next()){
cl = new Cliente();
cl.cod_cliente = (resultSet.getInt(1));
cl.nom_cliente = (resultSet.getString(2));
listResultado.add(cl);
x = x + 1;
}

	 statement.close();
	 return listResultado; 

Valeu…
Renato

New__Radical,

Ja tinha tentado … mas apresenta o erro abaixo:

java.lang.ClassCastException: cannot assign instance of CLocadoraImpl_Stub to field CLocadoraImpl$Cliente.this$0 of type CLocadoraImpl in instance of CLocadoraImpl$Cliente
at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:1840)
at java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1062)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1851)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
at java.util.ArrayList.readObject(ArrayList.java:548)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:824)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1746)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:297)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:146)
at CLocadoraImpl_Stub.pesquisarCliente(Unknown Source)
at ClPesquisaGeral$ClickButton.actionPerformed(ClPesquisaGeral.java:138)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1764)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1817)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:419)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:257)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)
at java.awt.Component.processMouseEvent(Component.java:5134)
at java.awt.Component.processEvent(Component.java:4931)
at java.awt.Container.processEvent(Container.java:1566)
at java.awt.Component.dispatchEventImpl(Component.java:3639)
at java.awt.Container.dispatchEventImpl(Container.java:1623)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3450)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3165)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3095)
at java.awt.Container.dispatchEventImpl(Container.java:1609)
at java.awt.Window.dispatchEventImpl(Window.java:1590)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:450)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:140)
at java.awt.Dialog.show(Dialog.java:538)
at ClPesquisaGeral.<init>(ClPesquisaGeral.java:122)
at ClCliente$ClickButton.actionPerformed(ClCliente.java:158)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1764)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1817)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:419)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:257)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)
at java.awt.Component.processMouseEvent(Component.java:5134)
at java.awt.Component.processEvent(Component.java:4931)
at java.awt.Container.processEvent(Container.java:1566)
at java.awt.Component.dispatchEventImpl(Component.java:3639)
at java.awt.Container.dispatchEventImpl(Container.java:1623)
at java.awt.Component.dispatchEvent(Component.java:3480)
at javax.swing.plaf.basic.BasicInternalFrameUI$GlassPaneDispatcher.retargetMouseEvent(BasicInternalFrameUI.java:1407)
at javax.swing.plaf.basic.BasicInternalFrameUI$GlassPaneDispatcher.forwardMouseEvent(BasicInternalFrameUI.java:1340)
at javax.swing.plaf.basic.BasicInternalFrameUI$GlassPaneDispatcher.mouseReleased(BasicInternalFrameUI.java:1273)
at java.awt.Component.processMouseEvent(Component.java:5134)
at java.awt.Component.processEvent(Component.java:4931)
at java.awt.Container.processEvent(Container.java:1566)
at java.awt.Component.dispatchEventImpl(Component.java:3639)
at java.awt.Container.dispatchEventImpl(Container.java:1623)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3450)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3165)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3095)
at java.awt.Container.dispatchEventImpl(Container.java:1609)
at java.awt.Window.dispatchEventImpl(Window.java:1590)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:450)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)

Aí esta a classe cliente, classe interface e
classe servidora …

// Classe Cliente

private class ClickButton implements ActionListener
{
java.sql.ResultSet result;
List lista = new ArrayList();

public void actionPerformed( ActionEvent e )
{
if (e.getSource() == bt1) {
try {
CLocadora obj = (CLocadora) Naming.lookup("//localhost/CLocadoraServer");
lista = obj.pesquisarCliente();
}
catch (Exception xe){
xe.printStackTrace();
}
}
}
}

// Classe Interface RMI

public interface CLocadora extends java.rmi.Remote {
String sayHello() throws java.rmi.RemoteException;

String sayHello2() throws java.rmi.RemoteException;

java.util.List pesquisarCliente() throws java.rmi.RemoteException;

}

// Classe SERVIDORA

public List pesquisarCliente() throws RemoteException {

  	conectaBanco();		
			
    List listResultado = new ArrayList();
    
    
    Statement statement;
	ResultSet resultSet;
	resultSet = null;
	
	try {
	 String query = "SELECT * FROM cliente";
	
	 statement = connection.createStatement();
	 resultSet = statement.executeQuery( query );		 

	 int x = 0;
	 Cliente cl = null;
	 while(resultSet.next()){
	   cl = new Cliente();
	   cl.cod_cliente = (resultSet.getInt(1));
	   cl.nom_cliente = (resultSet.getString(2));
	   listResultado.add(cl);
	   x = x + 1;
	  }	

	 statement.close();
	 return listResultado; 
	 
	 }
	 catch ( SQLException sqlex ) {		 	
	 sqlex.printStackTrace();
	 return listResultado;
	 }		 
	 
}

cara e só encapsula o resultset em uma interface remota… um exemplo.
a interface

[code]public interface ResultsetRMI extends java.rmi.Remote{

public boolean next&#40;&#41; throws Exception;

}
[/code]
Classe implementada

[code]public class ImpResultSetRMI extends java.rmi.server.UnicastRemoteObject implements ResultsetRMI{

private java.sql.ResultSet result = null;
/** Creates a new instance of ImpResultSetRMI */
public ImpResultSetRMI&#40;java.sql.ResultSet result&#41; throws java.rmi.RemoteException &#123;
    this.result = result;
&#125;

public boolean next&#40;&#41; throws Exception &#123;
    return result.next&#40;&#41;;
&#125;

}
[/code]

ai você termina de colocar os métodos na interface!!!

Faça Cliente implementar Serializable.

T+

Humm… ae já são outros quinheitos!
Dê uma olhadinha na mensagem de erro:

java.lang.ClassCastException: cannot assign instance of CLocadoraImpl_Stub to field CLocadoraImpl$Cliente.this$0 of type CLocadoraImpl in instance of CLocadoraImpl$Cliente.

Tão querendo dar um CAST e não está certo.
Coloca parte do código do actionPerformed aqui pra que nosotros possamos ver o que tu queres fazer.

T+