Erro ao retornar dados da classe RMI

5 respostas
R

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

5 Respostas

R

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)
R

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("<a href="//localhost/CLocadoraServer">//localhost/CLocadoraServer</a>");

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;
	 }		 
	 
}
B
cara e só encapsula o resultset em uma interface remota... um exemplo. a interface
public interface ResultsetRMI extends java.rmi.Remote&#123;
    
    public boolean next&#40;&#41; throws Exception;
    
&#125;
Classe implementada
public class ImpResultSetRMI extends java.rmi.server.UnicastRemoteObject implements ResultsetRMI&#123;
    
    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;
    
&#125;

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

N

Faça Cliente implementar Serializable.

T+

N

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+

Criado 12 de outubro de 2004
Ultima resposta 12 de out. de 2004
Respostas 5
Participantes 3