Erro de Cast - SelectItem

4 respostas
edysnipes

Boa noite!

Ao tentar popular um SelectItem é retornado um erro de Cast.

O que pode estar ocasionando o problema?

public List obterComboAreaGeral() {
		List cmbArea = new ArrayList();
		List area = obterRHFacade().obterAreas();
		Iterator iAi = area.iterator();
		cmbArea.add(new SelectItem("0", "-- Selecione --"));
		while (iAi.hasNext()) {
			Area a =  (Area) iAi.next(); -- ERRO DE CAST AQUI
			cmbArea.add(new SelectItem(a.getIdArea(), a.getNome()));
		}
		return cmbArea;
	}

Erro:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to …vo.Area

Obrigado!

4 Respostas

nel

Pelo o que eu pude compreender do seu código, você está tentando fazer um de um Objeto iterator para o seu Objeto Area, fica complicado mesmo não é? Bem, pelo menos com certeza o iterator não retorna um tipo Area.

Já ouviu falar em Foreach? Então, ele é ótimo! :)
Vou usar o seu código e acredito que resolva o seu problema.

public List<Area> obterComboAreaGeral() {  
        List<Area> cmbArea = new ArrayList<Area>();  
        List<Area> area = new ArrayList<Area>();
        area = obterRHFacade().obterAreas();    
        
        for(Area a : area) {              
            cmbArea.add(new SelectItem(a.getIdArea(), a.getNome()));  
        }  
       return cmbArea;  
  }

Dessa forma, você está declarando listas de um determinado tipo e usando o foreach você pode percorrer sua lista armazenando em outro objeto, nesse caso, cada posição da lista que guarda o objeto área será armezanado em a, sendo que pode utilizar isso como achar melhor.

Espero ter ajudado.
Abraços! :)

edysnipes

Boa dia. Implementei a sugestão do nel e nada ainda. O erro continua sendo no foreach.

for(Area a : areas){
				cmbArea.add(new SelectItem(a.getIdArea(), a.getNome()));
			}

Aqui não é lançada nenhuma exceção:

List<SelectItem> cmbArea = new ArrayList<SelectItem>();
		List<Area> areas = new ArrayList<Area>();
		areas = obterRHFacade().obterAreas(); // NORMAL, TUDO CERTO

Aguardo!

edysnipes

Nunca havia utilizado o EJB (Persistence)puro, sem Hibernate, acho que o problema é aki. Gostaria que retornasse uma list de Areas e não de Object:

public List<Area> obterAreaNacional() {
		// TODO Auto-generated method stub
		String sql = "SELECT a.idArea, a.nome FROM Area a WHERE a.idArea not in (select b.idLotacao from Regional b) ";
		List<Area> area = new ArrayList<Area>();
		try {
			Query query = getEntityManager().createQuery(sql);
			area = (ArrayList<Area>)query.getResultList();
			return area;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		
	}

Grato!
nel

Boa tarde.

Antes de mais nada, quando usa query.getResulList(); não há necessidade de dar um cast, pelo menos em todas as vezes que utilizei não precisei, basta que seja uma lista que receba o resultado. Outro detalhe, tem certeza que sua query está correta? E seus entitys (classes) possuiem o relacionamento imbutido nelas?

Ai vai uma sugestão, retire o a.idArea e o a.nome, tenta somente assim.

public List<Area> obterAreaNacional() {  
    // TODO Auto-generated method stub  
     
     //dessa forma você retorna o objeto area
     String sql = "SELECT a FROM Area a WHERE a.idArea not in (select b.idLotacao from Regional b) ";  

     List<Area> area = new ArrayList<Area>();  
     try {  
         Query query = getEntityManager().createQuery(sql);  
         area = query.getResultList();  
         return area;  
     } catch (Exception e) {  
         e.printStackTrace();           
     }  
       
}

Percebeu que retirei o return null? Nunca faça um método que retorne uma collection, list ou algo assim nulo, sempre retorne vazio, ou seja, se não receber nada retornará uma lista vazia.

Espero ter ajudado.

Abraços

Caso ocorra erro ou exception, nos envie a linha e e/ou exception que ocorreu o problema.

Criado 9 de outubro de 2009
Ultima resposta 10 de out. de 2009
Respostas 4
Participantes 2