Fabrizio73
06-05-2003, 20:58
Sto compiendo i primi passi con le EJB.
Come container sto adoperando JBoss 3.2.0 che a sua volta si appoggia su Tomcat 4.1.24.
Ho scritto uno Stateless Session Bean che dovrebbe semplicemente restituire la stringa "Hello World".
La Home Interface (HelloWorldHome.java):
package helloWorldEjb;
import javax.ejb.EJBHome;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
public interface HelloWorldHome extends EJBHome {
public HelloWorld create() throws RemoteException, CreateException;
}
La Remote Interface (HelloWorld.java):
package helloWorldEjb;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface HelloWorld extends EJBObject{
public String hello() throws RemoteException;
}
L'implementazione del Bean (HelloWorldBean.java):
package helloWorldEjb;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.EJBException;
import java.rmi.RemoteException;
public class HelloWorldBean implements SessionBean {
private SessionContext ctx;
public void ejbActivate() throws EJBException, RemoteException {
System.out.println("HelloWorldBean: ejbActivate()");
}
public void ejbPassivate() throws EJBException, RemoteException {
System.out.println("HelloWorldBean: ejbPassivate()");
}
public void ejbRemove() throws EJBException, RemoteException {
System.out.println("HelloWorldBean: ejbRemove()");
}
public void ejbCreate() {
System.out.println("HelloWorldBean: ejbCreate()");
}
public void setSessionContext(SessionContext sessionContext) throws EJBException, RemoteException {
ctx = sessionContext;
}
public String hello() {
System.out.println("HelloWorldBean: hello()");
return "Hello World";
}
}
Il Deployment Descriptor (ejb-jar.xml):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC
"-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<description>JBoss Stateless Session Bean Test</description>
<display-name>Hello World EJB</display-name>
<enterprise-beans>
<session>
<ejb-name>HelloWorld</ejb-name>
<home>helloWorldEjb.HelloWorldHome</home>
<remote>helloWorldEjb.HelloWorld</remote>
<ejb-class>helloWorldEjb.HelloWorldBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
Le tre classi vengono compilate correttamente da Forte for Java 4 CE.
Ho quindi creato l'archivio helloWorld.jar contenente le tre classi compilate e la directory META-INF contenente il Deployment Descriptor (ejb-jar.xml).
Fatto questo, ho copiato il helloWorld.jar nella directory C:\Appl\jboss-tomcat\server\default\deploy, dopo aver avviato JBoss.
Il deployment è avvenuto correttamente, come segnalato da JBoss.
A questo punto ho scritto il client (HelloWorldClient.java):
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import helloWorldEjb.HelloWorldHome;
import javax.rmi.PortableRemoteObject;
import helloWorldEjb.HelloWorld;
public class HelloWorldClient {
public static void main(String[] args) {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "localhost:1099");
env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
try {
Context ctx = new InitialContext(env);
Object obj = ctx.lookup("HelloWorld");
HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(obj, HelloWorldHome.class);
HelloWorld helloWorld = home.create();
System.out.println(helloWorld.hello());
helloWorld.remove();
} catch (Exception e) {
e.printStackTrace();
System.out.println("Eccezione: " + e.getMessage());
}
}
}
Prima di avviare il client ho inserito nel class-path i seguenti JAR:
- j2ee.jar
- jboss-common-client.jar
- jboss-client.jar
- jboss-system-client.jar
- jbosssx-client.jar
- jnp-client.jar
- log4j.jar
- helloWorld.jar
All'atto dell'esecuzione del client però, si verifica la seguente eccezione:
java.lang.NoClassDefFoundError: Lorg/jboss/tm/TransactionPropagationContextFactory;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:1494)
at java.lang.Class.getField0(Class.java:1727)
at java.lang.Class.getDeclaredField(Class.java:1189)
at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1430)
at java.io.ObjectStreamClass.access$400(ObjectStreamClass.java:45)
at java.io.ObjectStreamClass$3.run(ObjectStreamClass.java:331)
at java.security.AccessController.doPrivileged(Native Method)
at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:329)
at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:249)
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:449)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1521)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1435)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1626)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
at java.util.HashMap.readObject(HashMap.java:986)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:824)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1746)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
at org.jboss.proxy.ClientContainer.readExternal(ClientContainer.java:109)
at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1686)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1644)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
at java.rmi.MarshalledObject.get(MarshalledObject.java:135)
at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:30)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:514)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:471)
at javax.naming.InitialContext.lookup(InitialContext.java:347)
at HelloWorldClient.main(HelloWorldClient.java:29)
Exception in thread "main"
Dov'è il problema?
Cosa ho sbagliato?
Infinite grazie a chiunque possa aiutarmi!
Come container sto adoperando JBoss 3.2.0 che a sua volta si appoggia su Tomcat 4.1.24.
Ho scritto uno Stateless Session Bean che dovrebbe semplicemente restituire la stringa "Hello World".
La Home Interface (HelloWorldHome.java):
package helloWorldEjb;
import javax.ejb.EJBHome;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
public interface HelloWorldHome extends EJBHome {
public HelloWorld create() throws RemoteException, CreateException;
}
La Remote Interface (HelloWorld.java):
package helloWorldEjb;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface HelloWorld extends EJBObject{
public String hello() throws RemoteException;
}
L'implementazione del Bean (HelloWorldBean.java):
package helloWorldEjb;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.EJBException;
import java.rmi.RemoteException;
public class HelloWorldBean implements SessionBean {
private SessionContext ctx;
public void ejbActivate() throws EJBException, RemoteException {
System.out.println("HelloWorldBean: ejbActivate()");
}
public void ejbPassivate() throws EJBException, RemoteException {
System.out.println("HelloWorldBean: ejbPassivate()");
}
public void ejbRemove() throws EJBException, RemoteException {
System.out.println("HelloWorldBean: ejbRemove()");
}
public void ejbCreate() {
System.out.println("HelloWorldBean: ejbCreate()");
}
public void setSessionContext(SessionContext sessionContext) throws EJBException, RemoteException {
ctx = sessionContext;
}
public String hello() {
System.out.println("HelloWorldBean: hello()");
return "Hello World";
}
}
Il Deployment Descriptor (ejb-jar.xml):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC
"-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<description>JBoss Stateless Session Bean Test</description>
<display-name>Hello World EJB</display-name>
<enterprise-beans>
<session>
<ejb-name>HelloWorld</ejb-name>
<home>helloWorldEjb.HelloWorldHome</home>
<remote>helloWorldEjb.HelloWorld</remote>
<ejb-class>helloWorldEjb.HelloWorldBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
Le tre classi vengono compilate correttamente da Forte for Java 4 CE.
Ho quindi creato l'archivio helloWorld.jar contenente le tre classi compilate e la directory META-INF contenente il Deployment Descriptor (ejb-jar.xml).
Fatto questo, ho copiato il helloWorld.jar nella directory C:\Appl\jboss-tomcat\server\default\deploy, dopo aver avviato JBoss.
Il deployment è avvenuto correttamente, come segnalato da JBoss.
A questo punto ho scritto il client (HelloWorldClient.java):
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import helloWorldEjb.HelloWorldHome;
import javax.rmi.PortableRemoteObject;
import helloWorldEjb.HelloWorld;
public class HelloWorldClient {
public static void main(String[] args) {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "localhost:1099");
env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
try {
Context ctx = new InitialContext(env);
Object obj = ctx.lookup("HelloWorld");
HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(obj, HelloWorldHome.class);
HelloWorld helloWorld = home.create();
System.out.println(helloWorld.hello());
helloWorld.remove();
} catch (Exception e) {
e.printStackTrace();
System.out.println("Eccezione: " + e.getMessage());
}
}
}
Prima di avviare il client ho inserito nel class-path i seguenti JAR:
- j2ee.jar
- jboss-common-client.jar
- jboss-client.jar
- jboss-system-client.jar
- jbosssx-client.jar
- jnp-client.jar
- log4j.jar
- helloWorld.jar
All'atto dell'esecuzione del client però, si verifica la seguente eccezione:
java.lang.NoClassDefFoundError: Lorg/jboss/tm/TransactionPropagationContextFactory;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:1494)
at java.lang.Class.getField0(Class.java:1727)
at java.lang.Class.getDeclaredField(Class.java:1189)
at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1430)
at java.io.ObjectStreamClass.access$400(ObjectStreamClass.java:45)
at java.io.ObjectStreamClass$3.run(ObjectStreamClass.java:331)
at java.security.AccessController.doPrivileged(Native Method)
at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:329)
at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:249)
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:449)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1521)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1435)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1626)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
at java.util.HashMap.readObject(HashMap.java:986)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:824)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1746)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
at org.jboss.proxy.ClientContainer.readExternal(ClientContainer.java:109)
at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1686)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1644)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
at java.rmi.MarshalledObject.get(MarshalledObject.java:135)
at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:30)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:514)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:471)
at javax.naming.InitialContext.lookup(InitialContext.java:347)
at HelloWorldClient.main(HelloWorldClient.java:29)
Exception in thread "main"
Dov'è il problema?
Cosa ho sbagliato?
Infinite grazie a chiunque possa aiutarmi!