Problema com RMI

9 respostas
D

Galera, saldações!

Enfim, estou desenvolvendo um “trabalhinho” pra facul, sobre RMI, porem não manjo nada…

Ele é mais ou menos, um sisteminha q ira enviar uma conta e uma agencia pra uma classe, essa classe fará o select no banco e me retorna estes valores!!!

Simples,

Eu fiz e estava funcionando até que bem, só que estou tetando adicionar a funcionalidade de enviar o objeto conta e ai na classe q faz o select, adiciona os dados ao objeto e ai sim me retorna-o populado!

Porem, ao fazer estas alterações, ele lança uma excption:

java.rmi.MarshalException: error marshalling arguments; nested exception is:

java.io.NotSerializableException: Conta

at sun.rmi.server.UnicastRef.invoke(Unknown Source)

at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)

at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)

at $Proxy0.getConta(Unknown Source)

at ContaCliente.main(ContaCliente.java:26)

Caused by: java.io.NotSerializableException: Conta

at java.io.ObjectOutputStream.writeObject0(Unknown Source)

at java.io.ObjectOutputStream.writeObject(Unknown Source)

at sun.rmi.server.UnicastRef.marshalValue(Unknown Source)

Pelo q li bastava fazer a classe Conta implementar Serializable

Porem eu fiz isso, refiz o javac nas classes e nada!!!

PS, tenhoq criar o stub de quais classes, q não ficou claro isso na faculdade!

Obrigado,
Desde já!

9 Respostas

L

Duzas87:
Galera, saldações!

Enfim, estou desenvolvendo um “trabalhinho” pra facul, sobre RMI, porem não manjo nada…

Ele é mais ou menos, um sisteminha q ira enviar uma conta e uma agencia pra uma classe, essa classe fará o select no banco e me retorna estes valores!!!

Simples,

Eu fiz e estava funcionando até que bem, só que estou tetando adicionar a funcionalidade de enviar o objeto conta e ai na classe q faz o select, adiciona os dados ao objeto e ai sim me retorna-o populado!

Porem, ao fazer estas alterações, ele lança uma excption:

java.rmi.MarshalException: error marshalling arguments; nested exception is:

java.io.NotSerializableException: Conta

at sun.rmi.server.UnicastRef.invoke(Unknown Source)

at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)

at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)

at $Proxy0.getConta(Unknown Source)

at ContaCliente.main(ContaCliente.java:26)

Caused by: java.io.NotSerializableException: Conta

at java.io.ObjectOutputStream.writeObject0(Unknown Source)

at java.io.ObjectOutputStream.writeObject(Unknown Source)

at sun.rmi.server.UnicastRef.marshalValue(Unknown Source)

Pelo q li bastava fazer a classe Conta implementar Serializable

Porem eu fiz isso, refiz o javac nas classes e nada!!!

PS, tenhoq criar o stub de quais classes, q não ficou claro isso na faculdade!

Obrigado,
Desde já!

Tá dando pau no server na hora de serializar objeto Conta. Você atualizou o server?

Não é mais preciso criar stubs (o java faz em tempo de excução). Mas se for requisito do trabalho, stubs são criados para as classes de Objetos remotos (as que estendem UnicastRemoteObject ).

Abraços

D

Como assim atualizar o server??

O server é o proprio pc (localhost)

eu gerei o arquivo .class de todas

e implementei o serializable na classe que dava o erro, porem persistiu!

PS: Valew sobre a explicação do STUB!

Aguardo novas respostas!

Guitar_Men

O server e o client estão no mesmo projeto ?? Como esta estruturado o seu aplicativo ??

D

Sim

Server e Client pertence ao mesmo projeto!

É pequeno, tem 6 classes apenas!!

Tem um package VO -> de Conta

UM package Utilidades -> pra conexao do banco

e no defautl tem :

ContaCliente -> Envia pelo RMI ao ContaService(interface) os dados, q é respondido pelo ContaServiceImpl com os dados do BDD
ContaService -> Interface que tem o método getConta
ContaServiceImpl -> Classe implementação
ContaServidor -> Fica de servidor da aplicação

Guitar_Men

Posta o código da interface que chama Conta ai…

D
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.sql.SQLException;

import ValueObject.Conta;


public interface ContaService extends Remote{
	
	public Conta getConta( Conta conta ) throws RemoteException, SQLException;
	
}
D
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import Util.BDD.MySQLUtil;
import ValueObject.Conta;


public class ContaServiceImpl extends UnicastRemoteObject implements ContaService{
	private static final long serialVersionUID = -5138370841972698531L;

	public ContaServiceImpl() throws RemoteException{
		super();
	}
	
	public Conta getConta(Conta conta) throws RemoteException, SQLException {
		
		String sql = "SELECT * FROM CONTA WHERE CONTA = " + conta.getConta() + " AND AGENCIA = " + conta.getAgencia();
		PreparedStatement pstm = (PreparedStatement) MySQLUtil.getInstancia().getConexao().prepareStatement( sql );
		ResultSet rs = pstm.executeQuery();
		
			if ( rs.next() ){
				conta.setNome(rs.getString("NOME"));
				conta.setSaldo(rs.getDouble("SALDO"));
				return conta;
			}
			return conta;
		
		
	}

}
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.sql.SQLException;

import Exception.NaoEncontradoException;
import ValueObject.Conta;


public class ContaCliente {
	
	public static void main(String[] args) {

		try {
			
			ContaService c = (ContaService) Naming.lookup("rmi://localhost:1099/ContaService");

			Conta conta = new Conta();
			conta.setAgencia("34");
			conta.setConta("5678");

			conta = c.getConta(conta);
			
			System.out.println( "Nome--> " + conta.getNome() + "Saldo-->" + conta.getSaldo() );
			
			Conta conta2 = new Conta();
			conta2.setAgencia("12");
			conta2.setConta("1234");
			
			c.getConta(conta2);
			
			System.out.println( "Nome--> " + conta.getNome() + "Saldo-->" + conta.getSaldo() );

		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (NaoEncontradoException e) {
			e.getMessage();
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		}


	}

}
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;


public class ContaServidor {

	public ContaServidor(){

		try {

			ContaService conta = new ContaServiceImpl();
			Naming.rebind( "rmi://localhost:1099/ContaService", conta );
			
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}


	public static void main(String[] args) {
		new ContaServidor();
	}
}

Se precisarem de mais classes, deem um toque!

mas as principais são estas!!

D

Percebi agora tbm

que ao tentar compilar (pelo dos) a classe ContaServiceImpl ele da erro, falando q nao existe o import import com.mysql.jdbc.PreparedStatement;

mas ta normal no eclipse, q porra sera q é essa em???

D

Putz galera, acredito que descobri!!

Fiquei puto e apaguei todos os .classe comecei a gerar novamente!!

dai em um deles deu pau, dizendo que não encontrava o import do mysql :

import com.mysql.jdbc.PreparedStatement

dai alterei para este

import java.sql.PreparedStatement;

Compilei um por um, ja com o implements Serializable nas classes que irão trafegar e deu certo!

De todo jeito obrigado!

Vou tentar implementar uma Excessão específica agora!

Criado 11 de agosto de 2010
Ultima resposta 12 de ago. de 2010
Respostas 9
Participantes 3