Java.lang.ClassCastException - não sei a origem dele

Gente,

Minha aplicação tem três módulos, todos no mesmo .EAR .

O primeiro módulo já funciona perfeitamente e está em produção.
Estou desenvolvendo o segundo agora, e ao chamar um servlet
do primeiro (que já funciona), recebo a mensagem:

500 Internal Server Error

java.lang.ClassCastException: br.com.apexsystems.model.Produto
	at _conteudo._ct4__prod._jspService(_ct4__prod.java:56)
	[SRC:/conteudo/ct4_prod.jsp:11]
	at com.orionserver[Oracle9iAS (9.0.2.3) Containers for J2EE].http.OrionHttpJspPage.service(OrionHttpJspPage.java:56)
	at oracle.jsp.runtimev2.JspPageTable.service(JspPageTable.java:302)

Onde produto é uma classe que uso para passar os dados do DAO:

public class Produto implements Serializable {

}

O que pode estar gerando esse erro?

O problema está no seu jsp /conteudo/ct4_prod.jsp. Como você está acessando a classe Produto no jsp?
A classe Produto, só tem em um modulo? Só existe a br.com.apexsystems.model.Produto?

Só existe uma Classe Produto.

A linha q dá erro é a de buscar o atributo:

br.com.apexsystems.model.Produto produto = (Produto) request.getAttribute("produto");

Pergunta idiota, quem sabe ajuda: tem certeza que colocou um objeto Produto com a chave “protudo” na sessão?

Eu olhei no código e está correto.

Eu estou conversando com o Rafael pelo ICQ e ele sugeriu colocar
um System.out.println(“request de teste=”+request.getAttribute(“produto”));
pra checar a saida, e ele busca certo:

request de teste=br.com.apexsystems.model.Produto@14b146

Mas ainda assim dá erro
:frowning:

verifica se tu tem a classe Produto em mais de um jar, se existir, pode estar ocorrendo algum problema de ClassLoader carregando duas classes diferentes para contextos diferentes.

Na realidade é um container só pra essa aplicação, e só tem
um contexto mesmo.

Existe a máquina da produção, que é outro servidor, que
tem essa aplicação com o mesmo contexto.
Lá não dá esse erro.

Imprima o class loader de cada classe, assim coma a classe de do objeto que esta no request soh para ter certeza. realmente parece algum problema de classlaoding/stubing.

Imprima esses 3 do seu jsp:

br.com.apexsystems.model.Produto.class.getClassLoader()
request.getAttribute("produto").getClass()
request.getAttribute("produto").getClass().getClassLoader()

Ok, deu isso:

br.com.apexsystems.model.Produto.class.getClassLoader()=[ClassLoader: [[/u01/app/oracle/product/midleias/j2ee/home/applications/Catalogo.APEX.Desenvolvimento/catalogo/WEB-INF/classes], [/u01/app/oracle/product/midleias/j2ee/home/applications/Catalogo.APEX.Desenvolvimento/catalogo/WEB-INF/lib/iText.jar], [/u01/app/oracle/product/midleias/j2ee/home/applications/Catalogo.APEX.Desenvolvimento/catalogo/WEB-INF/lib/log4j-1.2.8.jar]]]
request.getAttribute(produto).getClass()=class br.com.apexsystems.model.Produto
request.getAttribute(produto).getClass().getClassLoader()=[ClassLoader: [[/u01/app/oracle/product/midleias/j2ee/home/applications/Catalogo.APEX.Desenvolvimento/catalogo/WEB-INF/classes], [/u01/app/oracle/product/midleias/j2ee/home/applications/Catalogo.APEX.Desenvolvimento/catalogo/WEB-INF/lib/iText.jar], [/u01/app/oracle/product/midleias/j2ee/home/applications/Catalogo.APEX.Desenvolvimento/catalogo/WEB-INF/lib/log4j-1.2.8.jar]]]

Aparentemente está ok.

Faltou imprimir um

Thread.currentThread().getContextClassLoader()

Estava comentando com o Luca agora a pouco em outro Thread (http://www.guj.com.br/forum/viewtopic.php?t=15945).
O arquivo ear e os arquivos jar que estão dentro deste ear têm ClassLoaders diferentes.
Eu acredito que possa existir mais de uma classe Produto em seus jars, e por isso está ocorrendo o ClassCastException.
Dá uma verificada nisso…

tente imprimir:
br.com.apexsystems.model.Produto.class.getClassLoader().equals(request.getAttribute(“produto”).getClass().getClassLoader())

no jar onde esta dando pau, ja estou quase desistindo desta possibilidade, mas não ta fazendo muito sentido este problema :frowning:

[quote=“urubatan”]tente imprimir:
br.com.apexsystems.model.Produto.class.getClassLoader().equals(request.getAttribute(“produto”).getClass().getClassLoader())

no jar onde esta dando pau, ja estou quase desistindo desta possibilidade, mas não ta fazendo muito sentido este problema :-([/quote]

antes do BD do guj crashar eu mandei ele testar com == e adivinha? false

com equals tambem vai dar false porque os classloaders nao reescrevem o equals.

Containers bons costumam sobrescrever o toString() dos classloaders pra oferecerem alguma informação útil.
Mas para achar esse tipo de erro o mais fácil é usar o identity hashcode dos objetos em questão, ou ==, como o Paulo sugeriu.

Bom, um colega meu (Jailton) sugeriu que eu colocasse tudo
que estivesse no WEB-INF/classes dentro de um .jar e
colocasse esse .jar no WEB-INF/lib .

Parece q a gambiarra funcionou :lol:

Segundo ele , problema de ClassLoaders no Oracle 9iAS
são bem conhecidos…

Fernando
isso eh simplesmente inaceitavel num container j2ee
eh incrivel como eles conseguem apssar nos testes da sun. comeco a desconfiar.

estou me preparando para começar a sofrer com isto :frowning:

estou iniciando um projeto que vai utilizar o OC4J :frowning:

[quote=“boaglio”]A linha q dá erro é a de buscar o atributo:

br.com.apexsystems.model.Produto produto = (Produto) request.getAttribute("produto"); [/quote]
Por que esse codigo não é apenas:

Produto produto = (Produto) request.getAttribute("produto");

Ou então:

br.com.apexsystems.model.Produto produto = (br.com.apexsystems.model.Produto) request.getAttribute("produto");

ps.: Sim, é chute mesmo!

valeuz…