Java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to

di il
1 risposte

Java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to

Ragazzi mi servirebbe un aiuto per risolvere questa eccezione

ho una classe corso fatta in questo modo

package model;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.*;

@Entity (name="Corsi")
@NamedQuery(name="Corsi.findAll", query="SELECT c FROM Corsi c")
public class Corso implements Serializable{


	private static final long serialVersionUID = -94024634956615516L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="id_corso")
	private int idCorso;
	
	
	@Column(name="descrizione")
	private String descrizione;
	
	@ManyToMany(mappedBy="corsi")
	private Set<Persona> persone;
	
	public Set<Persona> getPersone() {
		return persone;
	}
	
	public void setPersone(Set<Persona> persone) {
		this.persone = persone;
	}
	
	public int getIdCorso() {
		return idCorso;
	}
	
	public void setIdCorso(int idCorso) {
		this.idCorso = idCorso;
	}
	
	public String getDescrizione() {
		return descrizione;
	}
	
	public void setDescrizione(String descrizione) {
		this.descrizione = descrizione;
	}
	
	
}
poi ho una classe DebugProva

package dao;

import java.sql.Connection;
import java.util.*;
import javax.persistence.*;
import javax.servlet.http.HttpSession;

import model.Corso;

public  class DebugProva {
    @PersistenceContext(unitName = "JPAHibernateDataSource")
    protected static EntityManager em;
    @PersistenceUnit(unitName = "JPAHibernateDataSource")
    protected static EntityManagerFactory emf;
    protected static EntityTransaction tx = null; 
    protected static Connection conn = null;

    static
    {
	    emf = Persistence.createEntityManagerFactory("JPAHibernateDataSource");
	    em = emf.createEntityManager();
	    tx = em.getTransaction();
	    em.clear();
    }

    public static void init(HttpSession p_session)
    {
	    em.clear();
    }
    
    @SuppressWarnings("unchecked")
    public static Map<String,Corso> provaDebug() {
    	Query query = em.createNativeQuery("SELECT c.id_Corso, c.descrizione FROM corsi c");
    	List<Corso> listaCorsi = (List<Corso>) query.getResultList();
    	Map<String, Corso> descrizioniCorsi = new HashMap<String, Corso>();
    	for (Corso corso : listaCorsi) {
    	  String descrizione = corso.getDescrizione();
    	  descrizioniCorsi.put(descrizione, corso);
    	}
    	return descrizioniCorsi;
   }
}

package servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



import dao.DbUtils;
import dao.DebugProva;
import model.Macchina;
import model.Persona;
import model.Corso;

/**
* Servlet implementation class ListaPersone
*/
@WebServlet("/pippo")
public class ListaPersone extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public ListaPersone() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


List<Persona> listaPersone = DbUtils.selectAllPersone();


System.out.println("============= Prova DB ==========");
Map<String,Corso> map = DebugProva.provaDebug();
List<Corso> listaCorso = new ArrayList<Corso>(map.values());
for(Corso c : listaCorso) {
System.out.println("ID CORSO: "+ c.getIdCorso());
System.out.println("ID_DESCR: " + c.getDescrizione());
}


request.getSession().setAttribute("listaCorso", listaCorso);
request.getRequestDispatcher("result.jsp").forward(request, response);

}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}

}

La mia jsp è fatta in questo modo:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<%@ page import="model.Corso "%>
<%@ page import="java.util.List"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Lista Persone</title>
<%
	List<Corso> listaCorso = (List<Corso>) session.getAttribute("listacorso");
%>
</head>
<body>

    	<h2>Contenuto della tabella Corsi</h2>
	<table>
		<%
			for (int i = 0; i < listaCorso.size(); i++) {
				Corso c = listaCorso.get(i);
		%>
		<tr>
			<td><%=c.getIdCorso()%></td>
			<td><%=c.getDescrizione()%></td>
		</tr>
		<%
			}
		%>
	</table>
</body>
</html>
a runtime ho questo errore

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to model.Corso
	dao.DebugProva.provaDebug(DebugProva.java:52)
	servlet.ListaPersone.doGet(ListaPersone.java:47)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
qualcuno sa dirmi come risolverlo?

1 Risposte

  • Re: Java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to

    Il messaggio della eccezione è chiaro e dovresti comprenderlo.

    java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to model.Corso

    La parte "[Ljava.lang.Object;" è la forma usata per indicare che quell'oggetto è un array di Object, cioè un Object[]
    E chiaramente un array di Object NON può certo essere visto come un tuo tipo Corso.

    Ti dice anche il punto che ha scatenato il problema:

    dao.DebugProva.provaDebug(DebugProva.java:52)

    Il punto incriminato è sicuramente qui:
    for (Corso corso : listaCorsi) {

    Qui c'è un cast implicito a Corso è dovuto intrinsecamente al for-each. La questione è che quella lista NON contiene oggetti Corso. Hai usato createNativeQuery che ti permette di eseguire un SQL "nativo". Hai fatto la proiezione di due colonne specifiche che in sostanza vuol dire che quella lista contiene N array (Object[]) ciascuno con 2 elementi.

    Quindi, detto in generale, devi rivalutare/rivedere meglio come usare la persistence API.
Devi accedere o registrarti per scrivere nel forum
1 risposte