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() 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(java.sql.ResultSet result) throws java.rmi.RemoteException {
this.result = result;
}
public boolean next() throws Exception {
return result.next();
}
}
[/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+