ClasCastException entre camadas EJB 3

7 respostas
fbarreto

Galera to com um problemao aki,tenho um projeto ear que contem um jar com o ejb de acesso a dados,um jar com o client com as entidades e as interfaces dos ejbs.

e tenho um projeto web que contem o client com as interfaces dos ejb.

No meu bean chamo o ejb de acesso a dados para executar um metodo que me retorne uma lista de uma determinada entidade(ta no client), ele me retorno a lista certinho porem no loop que processa este retorno lah no projeto web ele me da um ClassCastException vejam:
Anormalidade cannot be cast to Anormalidade

O .Ear e o .War estao usando o mesmo ejbClient,
pq este erro?

Obrigado,bjos.

7 Respostas

fbarreto

ninguem :frowning:

gomesrod

Olá,

Eu já tive esse problema, estava utilizando JBoss.

O que acontece é o seguinte:
(atenção! não li isso em documentação, foi só o que observei na prática, portanto pode não estar 100% exato)

A JVM por algum motivo carrega duas vezes essas classes de entidades, que estão em ambos os EAR’s
(Talvez seja um bug no ClassLoader do JBoss, afinal só existe um Classloader e portanto devia carregar uma vez só cada classe)

De um jeito meio grosseiro, ficam existindo duas classes para cada entidade… A camada Web trabalhando com uma, e o EJB com outra… o que é muito maluco por sinal, o servidor cria uma espécie de “irmã gêmea” para esta classe de entidade, que embora seja igual na verdade não é a mesma… :expressionless:

E aí vem o erro, quando transfere um objeto de uma camada para outra (por exemplo, EJB retornando uma pesquisa para Web), o servidor em algum momento faz Cast para a classe gêmea. Ela não é a mesma e por isso dá ClassCastException.

Como eu disse, é apenas uma observação prática, não me pergunte por que acontece!

A solução é retirar essas entidades do pacote Web, deixa só no EAR do EJB. Na hora da execução a camada Web consegue utilizar normalmente, já que a classe foi carregada antes, e fica existindo uma só, sem a gêmea malvada para atrapalhar.

G

O jboss trabalha com hierarquia voce vai ter que editar o jboss-service.xml do war =) se não me engano

a hierarquia é JAR { SAR { JAR { WAR
{ EJB

OU SEJA PRIMEIRO É DEPLOY O WAR SEGUNDO O JAR+EJB TERCEIRO SAR E QUARTO O JAR

G

lembrei de algo pro c colocar no jboss

<mbean code = "org.jboss.deployment.scanner.URLDeploymentScanner...
<attribute name = "ScanPeriod">5000</attribute>
<attribute name = "URLs">
<attribute name = "RecursiveSearch">True</attribute>
<!--attribute name = "ScanEnable">false</attribute>
</mbean>
fbarreto

Não funcionou coloquei o arquivo jboss-service.xml na pasta conf do meu projeto web porem continua o mesmo erro guialeixo,

gomesrod tentei fazer o que vc disse mas meu projeto depende do client, se tirar o client dele ele nem faz deploy.

Obrigado pela ajuda de tds vcs,se souberem de algo mais fico grata.

bjos.

gomesrod

Tem razão, não é só tirar o client já que ele é necessário na hora de compilar.

Você deve fazer com que a classe esteja no Build Path do projeto Web (para que encontre as classes na hora da compilação), mas de uma maneira que não seja empacotado junto (deve ir apenas no EAR do EJB)

O jeito de fazer isso depende de como está o projeto. Por exemplo:

  • O jar do ejbclient está na pasta WEB-INF/lib ?
  • Existe um projeto EAR (Eclipse), configurado para adicionar o ejbclient ao pacote gerado?
  • O EAR é gerado manualmente, ou através de um script ant ?

Cada uma dessas maneiras tem um jeito de eliminar o ejbclient do EAR… depois, para que o projeto Web continue compilando com sucesso, adicione o projeto EJBClient ao Build Path.

Não sei se expliquei direito… dá uma fuçada aí, qualquer coisa é só perguntar!

fbarreto

bom amigos ,tentei mas naum deu certo ai desisti,coloquei td dentro do ear e funcionou blz.
Agradeco a atencao e ajuda de vcs amigos.
bjos.

Criado 25 de agosto de 2010
Ultima resposta 26 de ago. de 2010
Respostas 7
Participantes 3