Java.lang.IllegalArgumentException: object is not an instance of declaring class

6 respostas
A

Estou obtendo este erro incessantemente durante a inha busca no banco de dados… estou trabalhando com JPA/SPRING/JSF (Visual).
Alguém pode dar uma mão?

6 Respostas

Jiraiya

Então sem ver o código fica um pouco complicado avaliar o real motivo da ocorrência desse erro, contudo pelo visto você deve estar passando um objeto de uma instância diferente da esperada pelo método de busca

Tente dar uma revisada na lista de argumentos que esta passando para o método.

Qualquer coisa poste o código para o pessoal te ajudar mais efetivamente

A
if(textField2.getText()!=null && !textField2.getText().equals("")){

String c=textField2.getText().toString();

getFatdProvider().obterPorNGuerra©;

return null;

}
public void obterPorNGuerra(String nome) {

FatdList.clear();

if (fatdDao.obterPorNome(nome) != null) {

FatdList.add(fatdDao.obterPorNome(nome));

}

}
public List obterPorNome(String nome) throws DataAccessException{

Query query=getEntityManager().createQuery(SELECT f FROM fatd f WHERE f.alunos.nguerra like :nome);

query.setParameter(nome”,"%"+nome+"%");

return query.getResultList();

}

Estes são fragmentos dos três arquivos responsáveis por esta solicitaçàoDetalhe é que a entidade(object) Alunos é parte da fatd e possui o atributo nguerra
victorwss
Primeiro, aprenda a usar a tag [code]. É assim: [code]Hello World[/code] torna-se:
Hello World
Pois bem, agora vamos ao que interessa:
if(textField2.getText()!=null && !textField2.getText().equals("")){
            String c=textField2.getText().toString();            
            getFatdProvider().obterPorNGuerra(c);
            return null;
        }

public void obterPorNGuerra(String nome) {
        FatdList.clear();
        if (fatdDao.obterPorNome(nome) != null) {
            FatdList.add(fatdDao.obterPorNome(nome));
        }
    }

public List obterPorNome(String nome) throws DataAccessException{
        Query query=getEntityManager().createQuery("SELECT f FROM fatd f WHERE f.alunos.nguerra like :nome");
        query.setParameter("nome","%"+nome+"%");
        return query.getResultList();
    }
Observe que no método obterPorNGuerra você faz duas chamadas a obterPorNome, algo que é bem custoso, desnecessário e ineficiente. O melhor é chamar apenas uma vez assim:
public void obterPorNGuerra(String nome) {
        FatdList.clear();
        List lista = fatdDao.obterPorNome(nome);
        if (lista != null) {
            FatdList.add(lista);
        }
    }
Bem, é difícil saber o que o seu código deveria fazer com tão pouca informação sobre ele, mas acrescentar uma lista a alguma coisa parece estar errado. Não seria um addAll ou algo assim o que você gostaria de fazer? Ou talvez o tipo de retorno nem deveria ser uma lista.

Outra sugestão é que você tente usar os generics adequadamente. A exceção que você está pegando é sintoma de erros de tipo, e os generics foram criados para reduzir este tipo de problema. Por vezes, só de você começar a acrescentar os generics, alguns bugs antes ocultos começam a se tornar bem visíveis no código-fonte, o que ajuda bastante na correção.

A

Obrigado pela dica, vc tem razão agilizou bastante, mas e essa coisa de generics? Vc poderia dar um exemplo?

victorwss

Com generics, é usar List ao invés de List.

Um List pode ser uma lista de qualquer coisa, possivelmente de algo que você não quer. Por exemplo, em uma lista de gatos, se no código você sem querer tenta adicionar um cachorro, o código compila e dá pau na execução.
No entanto se você tiver List e tentar adicionar um cachorro, o compilador não vai deixar e te poupa o trabalho de ficar fazendo debug depois.

O seu código se tornaria algo deste tipo:

if(textField2.getText()!=null && !textField2.getText().equals("")){
            String c=textField2.getText().toString();            
            getFatdProvider().obterPorNGuerra(c);
            return null;
        }

public void obterPorNGuerra(String nome) {
        FatdList.clear();
        List<Fatd> lista = fatdDao.obterPorNome(nome);
        if (lista != null) {
            FatdList.add(lista);
        }
    }

@SuppressWarnings("unchecked")
public List<Fatd> obterPorNome(String nome) throws DataAccessException{
        Query query=getEntityManager().createQuery("SELECT f FROM fatd f WHERE f.alunos.nguerra like :nome");
        query.setParameter("nome","%"+nome+"%");
        return (List<Fatd>) query.getResultList();
    }
A

Grato pela dica amigo… tem razão…

Criado 5 de novembro de 2009
Ultima resposta 9 de nov. de 2009
Respostas 6
Participantes 3