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