[NÃO resolvido] java.lang.ClassCastException: Usuario cannot be cast to Usuario

23 respostas
T

Pessoal, estou com um erro aqui que não consigo resolver de jeito nenhum, achei poucas ocorrencias dele no google, e sem respostas...
bom, eis o problema: tenho uma classe Usuario, que é salva no banco de dados utilizando JPA para fins de login, até aí tudo bem. Quando vou fazer o login, existe um método q traz o Usuario do banco e compara com o Usuario que a pessoa informa os campos login e senha... Porém, as vezes o cast é realizado com sucesso e o login é efetuado, e outras vezes dá o ClassCastException (exatamente o mesmo codigo). Não sei mais o que fazer, eu ficaria mais feliz se SEMPRE ou NUNCA desse este erro, mas ele ocorre algumas vezes, e isso não faz sentido.

java.lang.ClassCastException: br.com.empresa.model.Usuario cannot be cast to br.com.empresa.model.Usuario

public Usuario findByLoginAndSenha(String login, String senha){
        //cria uma query a partir das querys existentes na classe Usuario
        Query query = entityManager.createNamedQuery("Usuario.findByLoginAndSenha");
        //seta os parametros da query
        query.setParameter("login", login);
        query.setParameter("senha", senha);

        Usuario result;
        try {
            System.out.println(query.getSingleResult()); //este println escreve no console exatamente as informacoes da classe Usuario
            Object obj = query.getSingleResult(); //get single result retorna um Object (que eu sei que é da classe Usuario)
            result = (Usuario) query.getSingleResult(); //aqui dá erro (as vezes apenas¬¬)
        } catch (NoResultException ex) {
            result = null;
        }
        return result;
    }

o pior de tudo é que as vezes funciona :(

23 Respostas

F

talvez cara, pq o null ele nao consiga converter para usuario… quando vc erra a senha…

isso acontece qndo acerta, erra ou ambos?

T

Quando o método não retorna nada, ele ñ retorna null, ele lança a “NoResultException” que tem ali… isto acontece com o login e senha corretos…

F

getSingleResult() retorna apenas 1 resultado…
isso retorna erro em 2 momentos
quando o resultado da consulta é 0 ou >1
verifique se nao existe usuario duplicado… ;D
ele pode estar retornando + de 1 resultado e ai ocasionando erro…
fllw

T

bom, este metodo getSingleResult lança uma exceção “NoUniqueResultException” quando retorna + de 1 resultado… (http://download.oracle.com/javaee/5/api/javax/persistence/Query.html#getSingleResult())

e no banco eu tenho certeza que só existe uma ocorrencia deste usuario… (é o unico do banco)

F

bom… dai não sei…
;D mas boa sorte pra ti ae…

A

também estou com o mesmo problema… o java não deixa eu dar cast numa classe igual :confused:

D

já passei por esse problema, o que acontecia era que dentro do servidor havia dois .jar com nomes diferentes mas com conteudo identico. durante o classloder pode ser referenciado um jar e na hora de executar ele referencia outro, gerando o erro classcastexception.

T

revirei os arquivos do projeto aqui, mas dentro do .war, só encontrei 1 ocorrencia da classe usuário… :confused:

D

talvez não esteja dentro do .war mas sim dentro do container, pasta lib, etc.

T

eu já vi todos os arquivos, não só o war… e as lib são todas externas (struts e jpa por exemplo)… n tem nada nem com o nome “Usuario”, e muito menos com o mesmo pacote (no erro indica que inclusive o pacote é o mesmo). já olhei todas as subpastas da pasta “target” do projeto…

D

você está utilizando o tomcat? vc está publicando pelo eclipse?

T

estou utilizando netbeans e glassfish

B

Oi, estou iniciando na área de programação

por isso peço desculpas por talves estar me descolocando em “tentar” responder ao seu problema, mas…

Tente identificar um padrão para esse erro, quando ele ocorre, se é que ele não é um bug do sistema, infelizmente comum no NetBeans.

Já que as vezes dá certo e outras não…

Novamente, desculpe caso não tenha ajudado.

Boa sorte amigo.

T

Eu acho que ñ é bug do netbeans não… pelas minhas pesquisas no google, eu acho que tem a ver com o ClassLoader, que o JPA as vezes pode usar um ClassLoader diferente do que é usado na minha classe… Uma solução (eu imagino), seria fazer a minha classe, ou o JPA utilizar o mesmo ClassLoader… Mas quando tentei fazer isto, ñ resolveu. Talvez eu tenha feito errado…

G

Opa galera, estou tendo o mesmo problema aqui. Tenho uma classe Usuario (também), mando listar do banco (que só tem um registro) e quando faço o cast do retorno do getSingleResult(), ClassCastException é lançada.

Alguém já encontrou uma solução?

Obrigado

A

g4lego:
Opa galera, estou tendo o mesmo problema aqui. Tenho uma classe Usuario (também), mando listar do banco (que só tem um registro) e quando faço o cast do retorno do getSingleResult(), ClassCastException é lançada.

Alguém já encontrou uma solução?

Obrigado

qual o servidor que você está usando? eu estava usando glassfish e tinha este problema, quando troquei para o tomcat passou a nao dar mais esta exception

G

Tou usando o glassfish 3. Vou mudar passar a usar o tomcat e ver no que dá.

Valeu!

G

Acredito que não dê pra usar o Tomcat, pois utilizo JSF + EJB + JPA. É possível?

A

eu acredito que é possível, mas tem que estar usando java 5, como java 6 eu nao estava conseguindo…por acaso tu nao esta usando maven junto?

G

Não estou usando o Maven. Eu sou iniciante em JEE… Trabalho com JSE há algum tempo, mas nunca usei JEE. Tou usando o Netbeans 6.8. Baixei o tomcat integrei no NB, mas quando vou criar o projeto (JEE Aplicativo Corporativo), só aparecem como opções o Glassfish 3 e o 2. Quando tento criar um projeto Java Web ele mostra o Tomcat.

Obrigado pela ajuda.

G

Vi em vários fóruns dizendo q o problema do ClassCastException é devido ao ClassLoader. Algo como 2 ClassLoaders diferentes carregando a mesma classe. O problema é que o pessoal diz o que está acontecendo, mas n fala como resolver eheheh.

Se alguem souber, agradeço mt. Estou parado em um projeto devido a isso =/

T

g4lego:
Vi em vários fóruns dizendo q o problema do ClassCastException é devido ao ClassLoader. Algo como 2 ClassLoaders diferentes carregando a mesma classe. O problema é que o pessoal diz o que está acontecendo, mas n fala como resolver eheheh.

Se alguem souber, agradeço mt. Estou parado em um projeto devido a isso =/

É esse mesmo o problema eu acho, pelo que pesquisei sobre classloaders, quando 2 classloaders diferentes carregam a mesma classe, o java “entende” como estas classes sendo diferentes. Isto é feita para segurança da JVM (não sei mais detalhes).

Pois é, todos sabem o problema mas ninguém sabe a solução :stuck_out_tongue:
O que resolveu aqui foi usar o tomcat ao invés do glassfish. Eu também tive o mesmo problema de não poder rodar o projeto no tomcat, isto aconteceu pq o meu projeto era java 6… Faz o seguinte: cria um projeto novo com java 5 (na tela de criação do projeto dá pra escolher), e copia os códigos e bibliotecas para este novo projeto…

Se você usa Maven, é mais fácil ainda pra fazer rodar no tomcat.

S

Acabei de passar pelo mesmo problema de ClassCastException, em uma situação um pouco diferente (pool de conexões Oracle no Tomcat).

Só que no meu caso, verifiquei que existia o jar na pasta compartilhada e também em outro projeto que não era o meu.

O que resolveu esta situação foi realizar o cast para uma interface, ao invés da implementação.

Antes:

Object o = new InitialContext().lookup("java:comp/env/jdbc/orcl");
OracleDataSource ds = (OracleDataSource) o;

Depois:

Object o = new InitialContext().lookup("java:comp/env/jdbc/orcl");
DataSource ds = (DataSource) o;
Criado 19 de janeiro de 2011
Ultima resposta 6 de set. de 2011
Respostas 23
Participantes 7