Dúvida com EJB 2 no Glassfish 3.1

Olá pessoal,

Queria ver se algum de vocês pode me ajudar numa dúvida envolvendo EJB 2 e Glassfish 3.1.

Bom, estou fazendo um exemplo simples e didático de EJB e escrevendo um cliente standalone para acessar esse EJB que deve me retornar a String “Hello World”.

Esses são os códigos do EJB:

[code]package ejb.ex01.interfaces;

import ejb.ex01.HelloBean;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface HelloHomeInterface extends EJBHome {

public HelloBean create() throws RemoteException, CreateException;

}
[/code]

[code]package ejb.ex01.interfaces;

import java.rmi.RemoteException;

import javax.ejb.EJBObject;

public interface HelloRemoteInterface extends EJBObject {

public String hello() throws RemoteException;

}
[/code]

[code]package ejb.ex01;

import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

public class HelloBean implements SessionBean {

private SessionContext ctx;

public void setSessionContext(SessionContext ctx) throws EJBException,
		RemoteException {
	this.ctx = ctx;
}

public void ejbRemove() throws EJBException, RemoteException {
	System.out.println("ejbRemove!");
}

public void ejbActivate() throws EJBException, RemoteException {
	System.out.println("ejbActivate!");
}

public void ejbPassivate() throws EJBException, RemoteException {
	System.out.println("ejbPassivate!");
}

public String hello() throws RemoteException{
	System.out.println("Hello world!");
	return "Hello, world!";
}

}[/code]

O meu arquivo ejb-jar.xml está da seguinte forma:

<ejb-jar> <enterprise-beans> <session> <ejb-name>Hello</ejb-name> <home>ejb.ex01.interfaces.HelloHomeInterface</home> <remote>ejb.ex01.interfaces.HelloRemoteInterface</remote> <ejb-class>ejb.ex01.HelloBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar>

Bom, tendo feito isso, eu faço o deploy desse EJB para o Glassfish 3.1, o que acontece com sucesso.
O Glassfish diz que o nome JNDI da interface home é o seguinte: ejb.ex01.interfaces.HelloHomeInterface

Bom, seguindo a documentação do Glassfish eu importo o gf-client.jar para meu projeto StandAlone ao invés da lib do j2ee. Além é claro de referenciar o projeto EJB.

Meu código da classe standalone é o seguinte:

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package ejbteste;

import ejb.ex01.interfaces.HelloHomeInterface;
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;

/**
*

  • @author jvferreira
    */
    public class EjbTeste {

    /**

    • @param args the command line arguments
      */
      public static void main(String[] args) throws NamingException, RemoteException {
      Context context = new InitialContext();

      Object obj =
      context.lookup(“ejb.ex01.interfaces.HelloHomeInterface”);

      HelloHomeInterface home =
      (HelloHomeInterface)
      PortableRemoteObject.narrow(obj, HelloHomeInterface.class);

      System.out.println(home.create().hello());
      }
      }
      [/code]

Agora sim vem o erro. Na hora em que eu tento rodar esse código, acontece o seguinte erro:

Exception in thread "main" java.lang.ClassCastException: ejb.ex01.interfaces._HelloRemoteInterface_DynamicStub cannot be cast to ejb.ex01.HelloBean at $Proxy178.create(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:144) at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:174) at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:528) at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:199) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990) at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324) at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497) at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540) Java Result: 1

Vocês poderiam me ajudar nesse problema.

Obrigado e desculpem a longa postagem.

João Victor