Java.lang.ClassCastException: $Proxy2 cannot be cast to

2 respostas
W

Ola pessoa, preciso de uma ajuda tenho um sistema que faz uma chamada em um metodo no servidor, esse metodo faz uma busca no banco de dados e retorn uma vetor do tipo "pergunta" porem quando chega no cliente estou recebendo o seguinte erro:

o codigo das classes estao logo depois do erro, nao consegui resolver isso, preciso muito de ajuda.

Resultado no terminal do Cliente:

comecando a conectar
buscando uma pergunta
ja passou da busca
java.lang.ClassCastException: $Proxy2 cannot be cast to rmi.pergunta
	at Principal.inicio.<init>(inicio.java:72)
	at Principal.Game$25$1.run(Game.java:1348)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

servidor

package rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;




public class Server {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		
		new Server();
	}
	
	
	public Server() {
		if(System.getSecurityManager() == null) {
			System.setSecurityManager(new SecurityManager());
			
		}
		
		Perguntas pergunta = null;
		vezInterface vez = null;
		
		try {
			pergunta = new daoPerguntas();
			vez=new vez();
			
		}catch (RemoteException e){
			e.printStackTrace();
		}
		
		try{
			java.rmi.registry.LocateRegistry.createRegistry(1099); 
			Naming.rebind("rmi://localhost:1099/vez", vez);
			Naming.rebind("rmi://localhost:1099/pergunta", pergunta);
			System.out.println("Aguardando...");
		}catch(RemoteException e){
			e.printStackTrace();
		}catch(MalformedURLException e){
			e.printStackTrace();
		}
	}
	
}

interface perguntas

package rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Vector;

public interface Perguntas extends Remote{


	public Vector<pergunta> buscar(String tabela, int id, int dificuldade) throws RemoteException;
	
}

class dao perguntas

package rmi;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
import java.sql.Statement;  
import java.util.Vector;  
  
import javax.swing.JOptionPane;  
  
import rmi.pergunta;  
import banco.ConFactory;


public class daoPerguntas extends UnicastRemoteObject implements Perguntas, Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;


	public daoPerguntas() throws RemoteException {

	}


	private final String URL ="jdbc:mysql://localhost/algoquester",
		NOME = "root", SENHA = "";
	
	private Connection con;
	private Statement comando;
	
	
	public void apagar(String tabela, int id){
		
		conectar();
		try {
			comando.executeUpdate("Delete FROM" + tabela + "WHERE id= '" +id+ "';");
		} catch (SQLException e) {
				imprimeErro("Erro ao apagar pergunta", e.getMessage());
		} finally {
			fechar();
		}
	}

		
		
	public Vector<pergunta> buscarTodos(String tabela) throws RemoteException {
		conectar();
		Vector<pergunta> resultados = new Vector<pergunta>();
		ResultSet rs;
		try {
			rs = comando.executeQuery("SELECT * FROM " + tabela);
			while (rs.next()) {
				pergunta temp = new pergunta();
				//pega todos os atributos da pergunta
				temp.setDificuldade(rs.getInt("dificuldade"));
				temp.setPergunta(rs.getString("pergunta"));
				temp.setRespA(rs.getString("respA"));
				temp.setRespB(rs.getString("respB"));
				temp.setRespC(rs.getString("respC"));
				temp.setRespD(rs.getString("respD"));
				temp.setRespE(rs.getString("respE"));
				String resposta = rs.getString("respCerta");
				char respCerta = resposta.charAt(0);
				temp.setRespCerta(respCerta);
				temp.setRespQuantidade(rs.getInt("respQuantidade"));
				resultados.add(temp);				
			}
			return resultados;
		}catch (SQLException e) {
			imprimeErro("Erro ao buscar pergunta", e.getMessage());
			return null;
		}
	}
	
	public Vector<pergunta> buscar(String tabela, int id ,int dificuldade) throws RemoteException {
		conectar();
		Vector<pergunta> resultados = new Vector<pergunta>();
		ResultSet rs;
		try {
			
			rs = comando.executeQuery("Select * FROM " +tabela+ " WHERE id='" +id+ "' and dificuldade ='" +dificuldade +"';");
			while (rs.next()) {
				pergunta temp = new pergunta();
				//pega todos os atributos da pergunta buscada
				temp.setPergunta(rs.getString("pergunta"));
				temp.setRespA(rs.getString("respA"));
				temp.setRespB(rs.getString("respB"));
				temp.setRespC(rs.getString("respC"));
				temp.setRespD(rs.getString("respD"));
				temp.setRespE(rs.getString("respE"));
				String resposta = rs.getString("respCerta");
				char respCerta = resposta.charAt(0);
				temp.setRespCerta(respCerta);
				temp.setRespQuantidade(rs.getInt("respQuantidade"));
				resultados.add(temp);
			}
			return resultados;
		} catch (SQLException e) {
			imprimeErro("Erro ao buscar pergunta", e.getMessage());
			return null;
		}
	}
	

	public void insere(String tabela, pergunta pergunta){
		conectar();
		try {
			comando.executeUpdate("INSERT INTO " +tabela+ "VALUES('" +pergunta.getDificuldade()+ "' , '" + pergunta.getPergunta()+
			"' , '" +pergunta.getRespA()+ "', '" +pergunta.getRespB()+"', '" +pergunta.getRespC()+ "','"+pergunta.getRespD()+"','" +
			pergunta.getRespE()+"','"+pergunta.getRespCerta()+"','" +pergunta.getRespQuantidade()+ "')");
		} catch (SQLException e) {
			imprimeErro("Erro ao inserir pergunta", e.getMessage());
		} finally {
			fechar();
		}
	}
	
	private void conectar(){
		try {
			con = ConFactory.conexao(URL, NOME, SENHA, ConFactory.MYSQL);
			comando = con.createStatement();
			System.out.println("Conectado!");
		} catch (ClassNotFoundException e) {
			imprimeErro("Erro ao carregar o driver", e.getMessage());
		} catch (SQLException e) {
			imprimeErro("Erro ao conectar", e.getMessage());
		}
	}
	
	private void fechar() {
		try {
			comando.close();
			con.close();
			System.out.println("Conexão Fechada");
		} catch (SQLException e) {
			imprimeErro("Erro ao fechar conexão", e.getMessage());
		}
	}
	
	
	private void imprimeErro(String msg, String msgErro) {
		JOptionPane.showMessageDialog(null,  msg, "Erro Critico", 0);
		System.err.println(msg);
		System.out.println(msgErro);
		System.exit(0);
	}
}

classe perguntas

package rmi;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;


public class pergunta extends UnicastRemoteObject implements Serializable{
	
	
	public pergunta() throws RemoteException {
	}
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int dificuldade, respQuantidade;
	private String pergunta, respA, respB, respC, respD, respE;
	private char respCerta;
	public int getDificuldade() {
		return dificuldade;
	}
	public void setDificuldade(int dificuldade) {
		this.dificuldade = dificuldade;
	}
	public String getPergunta() {
		return pergunta;
	}
	public void setPergunta(String pergunta) {
		this.pergunta = pergunta;
	}
	public String getRespA() {
		return respA;
	}
	public void setRespA(String respA) {
		this.respA = respA;
	}
	public String getRespB() {
		return respB;
	}
	public void setRespB(String respB) {
		this.respB = respB;
	}
	public String getRespC() {
		return respC;
	}
	public void setRespC(String respC) {
		this.respC = respC;
	}
	public String getRespD() {
		return respD;
	}
	public void setRespD(String respD) {
		this.respD = respD;
	}
	public String getRespE() {
		return respE;
	}
	public void setRespE(String respE) {
		this.respE = respE;
	}
	public char getRespCerta() {
		return respCerta;
	}
	public void setRespCerta(char respCerta) {
		this.respCerta = respCerta;
	}
	public int getRespQuantidade() {
		return respQuantidade;
	}
	public void setRespQuantidade(int respQuantidade) {
		this.respQuantidade = respQuantidade;
	}
	
}

no lado do cliente :

parte da classe que faz a chamada rmi e tenta mostrar o resultado;

System.out.println("comecando a conectar");

		Perguntas busca =  (Perguntas) Naming.lookup("rmi://localhost:1099/pergunta");
		System.out.println("buscando uma pergunta");
		Vector<pergunta> resultado = busca.buscar(tabela, id, dificuldade);
		System.out.println("ja passou da busca");
		
		JButton btnFechar = new JButton("Fechar");
		btnFechar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
			}
		});
		
//		Color bg = new Color(1f,1f,1f,0);
		
		JTextArea txtAreaResposta = new JTextArea();
		txtAreaResposta.setEditable(false);
		for (Iterator<pergunta> iterator = resultado.iterator(); iterator.hasNext();) {
		
		final pergunta perg = iterator.next();	
			
		//perguntasInterface perg = new pergunta();
		//perg = iterator.next();
		txtAreaResposta.setText(perg.getPergunta());

Dentro do projeto do cliente tem um pacote igual do servidor com a classe pergunta e a interface Perguntas.

agradeco desde de ja pela ajuda de quem puder.

2 Respostas

R

Sua classe pergunta não deve extender UnicastRemoteObject. Pois ela é o Objeto que trafega na rede e não o serviço de conexão como a classe daoPergunta que implementa a inteface Pergutas extends Remote.

Dai como perguta tambem é UnicastRemoteObject ná hora de de-serializar a VM capota.

E daoPergunta não precisa implementar Serializable… você não vai trafegar ele pela rede, salvar-lo em banco ou afins. É só uma instância de servido de conexão.

W

aeee funcionou!!! Valeu pela ajuda!

Criado 12 de abril de 2012
Ultima resposta 16 de abr. de 2012
Respostas 2
Participantes 2