Dúvida com EJB 2 no Glassfish 3.1

0 respostas
jvictorcf

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:

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;
	
}
package ejb.ex01.interfaces;

import java.rmi.RemoteException;

import javax.ejb.EJBObject;

public interface HelloRemoteInterface extends EJBObject {

	public String hello() throws RemoteException;
	
}
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!";
	}

}

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:

/*
 * 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());
    }
}

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

Criado 22 de março de 2012
Respostas 0
Participantes 1