ClassCastException quando faço cast de initContext.lookup(JNDIName);

11 respostas
Roger75

Olá

Tenho o seguinte trecho de código na minha classe Delegate:

try {

System.out.println(“Procurando recursoBean home interface…”);

String JNDIName = java:comp/env/ejb/Recurso;

System.out.println("- Procurando por: " + JNDIName);

recursoHome = (RecursoHome)initContext.lookup(JNDIName);

System.out.println("- Encontrou recursoHome");

}

Está ocorrendo exceção ClassCastException na linha

recursoHome = (RecursoHome)initContext.lookup(JNDIName);
Mas debugando no eclipse, verifiquei que initContext.lookup(JNDIName) retorna um objeto “_RecursoHome_Stub”. O cast não devia dar certo?

(Estou usando Sun One Appication Server 7 com struts e ejb)

11 Respostas

G

Oi Roger,

Qual JDK você está usando? De um modo geral, a forma correta de fazer o cast é usando narrow:

Object obj = initContext.lookup(JNDIName);
recursoHome = (RecursoHome) PortableObject.narrow(obj, RecursoHome.class)

Abraços,

Roger75

Oi,

Antes mesmo da sua dica eu já tinha tentado colocar assim:

[color=blue]Object objref = initContext.lookup(JNDIName);
recursoHome = (RecursoHome)PortableRemoteObject.narrow(objref,
RecursoHome.class)
;[/color]

mas deu o mesmo classcastexception do mesmo jeito…

G

Então, mas qual JDK você está usando?

Esou perguntando por causa deste bug http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4911077 que já me f**** a vida bastante no passado.

Roger75

Minha jdk é a 1.4.2_04

G

Pode ser também que você esteja usando o RMIC errado. Qual SO você está usando?
Não quer aproveitar e mandar o stacktrace do erro?

Roger75

Tem um outro post que fala alguma coisa de classloader. Será que tem a ver?

De qualquer modo segue o stacktrace do erro:

[color=darkblue]WARNING: CORE3283: stderr: java.lang.ClassCastException

WARNING: CORE3283: stderr:      at samples.jdbc.simple.teste.delegate.RecursoDelegate.<init>(Recurso

Delegate.java:101)

WARNING: CORE3283: stderr:      at samples.jdbc.simple.teste.action.ConsultaRecursoAction.execute(Co

nsultaRecursoAction.java:27)

WARNING: CORE3283: stderr:      at org.apache.struts.action.RequestProcessor.processActionPerform(Re

questProcessor.java:484)

WARNING: CORE3283: stderr:      at org.apache.struts.action.RequestProcessor.process(RequestProcesso

r.java:274)

WARNING: CORE3283: stderr:      at org.apache.struts.action.ActionServlet.process(ActionServlet.java

:1482)

WARNING: CORE3283: stderr:      at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:5

07)

WARNING: CORE3283: stderr:      at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)

WARNING: CORE3283: stderr:      at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardWrapperValve.invokeServletServic

e(StandardWrapperValve.java:720)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardWrapperValve.access$000(Standard

WrapperValve.java:118)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardWrapperValve$1.run(StandardWrapp

erValve.java:278)

WARNING: CORE3283: stderr:      at java.security.AccessController.doPrivileged(Native Method)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrap

perValve.java:274)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline

.java:505)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardContextValve.invoke(StandardCont

extValve.java:212)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline

.java:505)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostVal

ve.java:203)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline

.java:505)

WARNING: CORE3283: stderr:      at com.iplanet.ias.web.connector.nsapi.NSAPIProcessor.process(NSAPIP

rocessor.java:158)

WARNING: CORE3283: stderr:      at com.iplanet.ias.web.WebContainer.service(WebContainer.java:598)

WARNING: CORE3283: stderr: java.lang.ClassCastException

WARNING: CORE3283: stderr:      at samples.jdbc.simple.teste.delegate.RecursoDelegate.<init>(Recurso

Delegate.java:121)

WARNING: CORE3283: stderr:      at samples.jdbc.simple.teste.action.ConsultaRecursoAction.execute(Co

nsultaRecursoAction.java:27)

WARNING: CORE3283: stderr:      at org.apache.struts.action.RequestProcessor.processActionPerform(Re

questProcessor.java:484)

WARNING: CORE3283: stderr:      at org.apache.struts.action.RequestProcessor.process(RequestProcesso

r.java:274)

WARNING: CORE3283: stderr:      at org.apache.struts.action.ActionServlet.process(ActionServlet.java

:1482)

WARNING: CORE3283: stderr:      at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:5

07)

WARNING: CORE3283: stderr:      at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)

WARNING: CORE3283: stderr:      at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardWrapperValve.invokeServletServic

e(StandardWrapperValve.java:720)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardWrapperValve.access$000(Standard

WrapperValve.java:118)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardWrapperValve$1.run(StandardWrapp

erValve.java:278)

WARNING: CORE3283: stderr:      at java.security.AccessController.doPrivileged(Native Method)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrap

perValve.java:274)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline

.java:505)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardContextValve.invoke(StandardCont

extValve.java:212)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline

.java:505)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostVal

ve.java:203)

WARNING: CORE3283: stderr:      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline

.java:505)

WARNING: CORE3283: stderr:      at com.iplanet.ias.web.connector.nsapi.NSAPIProcessor.process(NSAPIP

rocessor.java:158)

WARNING: CORE3283: stderr:      at com.iplanet.ias.web.WebContainer.service(WebContainer.java:598)[/color]

Uso Windows 2000 professional

G

O problema é na hora de inicializar RecursoDelegate, e me parece que é do lado do servidor. O narrow provavelmente está fazendo alguma chamada remota que está fazendo dar esse pau.

Algo do tipo:

class C {
   private Field vouDarPau = (Field) Incompativel.createInstance();

}

Cole o código de RecursoDelegate aqui e, por favor, inclua esse código num bloco code.

Roger75

Segue o código do meu Delegate:

package samples.jdbc.simple.teste.delegate;

import java.util.Collection;
import java.util.Hashtable;

import javax.naming.InitialContext;

import samples.jdbc.simple.teste.remote.RecursoHome;
import samples.jdbc.simple.teste.remote.RecursoObject;
import samples.jdbc.simple.teste.serviceLocator.ServiceLocator;
import samples.jdbc.simple.teste.vo.RecursoVO;
import javax.rmi.PortableRemoteObject;

public class RecursoDelegate {

	  // Remote reference for Session Facade
	  private RecursoObject ejbObject;

	  // Class for Session Facade's Home object
	  private static final Class homeClazz = RecursoHome.class;

	  // Default Constructor. Looks up home and connects
	  // to session by creating a new one
	  public RecursoDelegate() throws Exception {

	  	RecursoHome recursoHome;
	  	InitialContext initContext = null;
	    Hashtable env = new java.util.Hashtable(1);
	    try {
	        initContext = new javax.naming.InitialContext();
	        System.out.println("- Retornou initial context com sucesso");
	      }
	      catch (Exception e) {
	        System.out.println("- Excecao criando InitialContext: " + e.toString());
	        return;
	      }
	      try {
	        System.out.println("Procurando recursoBean home interface...");
	        String JNDIName = "java:comp/env/ejb/Recurso";
	        System.out.println("- Procurando por: " + JNDIName);

	        Object objref = initContext.lookup(JNDIName);
			recursoHome = (RecursoHome)PortableRemoteObject.narrow(objref,
                                            RecursoHome.class);

	        System.out.println("- Encontrou recursoHome");
	      }catch(Exception e){
	      	e.printStackTrace();
	      }





	  	Object o=ServiceLocator.getInstance().getEJBHome("java:comp/env/ejb/Recurso", homeClazz);

//		  RecursoHome ejbHome = (RecursoHome)
//	        ServiceLocator2.getInstance().getEJBHome(
//	          "ejb/Recurso", homeClazz);

		  //RecursoHome ejbHome = (RecursoHome)o;

		  RecursoHome ejbHome = (RecursoHome)
        ServiceLocator.getInstance().getEJBHome(
          "java:comp/env/ejb/Recurso", homeClazz);


	      ejbObject = ejbHome.create();
	  }

	  //public void setRecurso (RecursoVO recurso) throws Exception {
	//	  ejbObject.setRecurso(recurso);
	//  }

	//  public void updateRecurso (RecursoVO recurso) throws Exception {
	//	  ejbObject.updateRecurso(recurso);
	//  }

	  public Collection getRecursos () throws Exception {
		  return ejbObject.getRecursos();
	  }

	  public RecursoVO getRecurso (Integer recursoId) throws Exception {
		  return ejbObject.getRecurso(recursoId);
	  }

	//  public void removeRecurso (Integer recursoId) throws Exception {
	//	  ejbObject.removeRecurso(recursoId);
	//  }

	//  public void setRecursoXML (InputStream inputStream) throws Exception {
	//	  ejbObject.setRecursoXML(inputStream);
	//  }

}

(No preview a tag code não funciona direito, por isso não tava usando...)

G

Agora entendi. Essa classe já é de lado servidor.
Minhas hipóteses estão esgotadas - eu de fato nunca tive esse problema. Levantar novas hipóteses via fórum fica meio difícil, então acho que não vou poder te ajudar. :frowning:

Boa sorte.

Abraços,

Roger75

Apesar de não ter resolvido o problema agradeço a atenção.

Roger75

Consegui resolver o problema!

O empacotamento que dava certo no JBoss não dava certo no SunOne. No JBoss eu tinha os seguintes pacotes:
Arquivo war:

  • vo
  • serviceLocator
  • remote (com as interfaces Home e Object do EJB)
  • delegate
  • action

Arquivo jar(EJB):
-vo
-serviceLocator
-remote
-dao
-bean (classes bean dos EJB)

No SunOne esta estrutura dá pau. Então coloquei as classes dos pacotes remote e bean num pacote ejb, e este pacote coloquei no jar(EJB), além de remover os pacotes remote e bean.

Eu pensava que todos os containers aceitavam a mesma estrutura de pacotes, eles não têm que seguir a especificação J2EE?
Percebi que este problema é complicado, pois coloquei a pergunta até nos fóruns da Sun e do Javaranch mas não obtive resposta não…

Criado 5 de junho de 2006
Ultima resposta 13 de jun. de 2006
Respostas 11
Participantes 2