# EJB-Beispielanwendung



## Rumborak (2. Mai 2007)

Hallo zusammen,

ich bin gerade dabei, mich in EJB einzuarbeiten. Beim Versuch, die mit dem J2EE-Tutorial gelieferte Beispielanwendung zum Laufen zu bekommen, scheitere ich bereits.

Das Beispiel befindet sich im Ordner *\j2eetutorial14\examples\ejb\cart\src* bzw. online auf http://java.sun.com/j2ee/1.4/docs/tutorial/doc/Session.html - ist eigentlich alles dabei. Home-Interface, Remote-Interface, die Bean, usw.

Ich verstehe jetzt nur noch nicht so richtig, wie das Ganze funktioniert. Ich habe ein neues Projekt in MyEclipse angelegt und die Dateien reinkopiert. Die ejb-jar.xml habe ich dann selbst angelegt (braucht man die hier überhaupt?):
	
	
	
	





```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC
	"-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
	"http://java.sun.com/j2ee/dtd/ejb-jar_2_0.dtd">

<ejb-jar>
	<enterprise-beans>
		<session>
			<ejb-name>Cart</ejb-name>
			<home>CartHome</home>
			<remote>Cart</remote>
			<ejb-class>CartBean</ejb-class>
			<session-type>Stateful</session-type>
			<transaction-type>Container</transaction-type>
		</session>
	</enterprise-beans>
	<assembly-descriptor>
		<container-transaction>
			<method>
				<ejb-name>Cart</ejb-name>
				<method-name>*</method-name>
			</method>
			<trans-attribute>Required</trans-attribute>
		</container-transaction>
	</assembly-descriptor>
</ejb-jar>
```

Irgendwie weiß ich jetzt nicht weiter. Wenn ich das Projekt als JAR exportiere und in den webapps-Ordner vom Tomcat reinkopiere passiert überhauptnichts.

Wie kann ich denn nun das Beispiel mal ausprobieren?

Ich hoffe meine Frage ist nicht zu doof. Wäre super, wenn mir da jemand einen Tip oder zumindest einen Schubs in die richtige Richtung geben könnte.

Danke schonmal!


----------



## Guest (2. Mai 2007)

Tomcat selbst ist kein EJB-Container, da brauchst du schon einen Application Server, z.B. JBoss oder den Java Application Server von Sun.


----------



## Rumborak (2. Mai 2007)

OK,

ich hab das jetzt mal auf dem JBoss deployed. Meine Cart wird auch in der Management Console richtig angezeigt. Wenn ich allerdings den Client starte, erscheint folgende Fehlermeldung:
	
	
	
	





```
Caught an unexpected exception!
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:247)
	at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:284)
	at javax.naming.InitialContext.lookup(InitialContext.java:351)
	at CartClient.main(CartClient.java:39)
```
Was für eine Resource-Datei brauche ich denn da jetzt noch? Oder muß da was im Quellcode direkt eingetragen werden?

In dem Tutorial ist das mit dem *deploytool* erklärt. Wie krieg ich das denn so hin - in meinem Fall mit Eclipse...?


----------



## Guest (3. Mai 2007)

Ich habe zwar selbst nicht viel Erfahrung mit JBoss, aber vielleicht hilft dir das weiter.


----------



## Rumborak (8. Mai 2007)

Jo, da bin ich wieder!

Ich habe jetzt mal eine Hashtable mit JNDI-Parametern in meinen Client eingefügt:
	
	
	
	





```
import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

public class CartClient
{
  public static void main( String[] args )
  {
    Hashtable< String, String > env = new Hashtable< String, String >();
    env.put( "java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory" );
    env.put( "java.naming.provider.url", "localhost:8080" );

    try
    {
      Context initial = new InitialContext( env );
      Object objref = initial.lookup( "java:comp/env/ejb/SimpleCart" );

      CartHome home = (CartHome) PortableRemoteObject.narrow( objref, CartHome.class );

      Cart shoppingCart = home.create( "Duke DeEarl", "123" );

      shoppingCart.addBook( "The Martian Chronicles" );
      shoppingCart.addBook( "2001 A Space Odyssey" );
      shoppingCart.addBook( "The Left Hand of Darkness" );

      Vector bookList = new Vector();

      bookList = shoppingCart.getContents();

      Enumeration enumer = bookList.elements();

      while ( enumer.hasMoreElements() )
      {
        String title = (String) enumer.nextElement();

        System.out.println( title );
      }

      shoppingCart.removeBook( "Alice in Wonderland" );
      shoppingCart.remove();

      System.exit( 0 );
    }
    catch ( BookException ex )
    {
      System.err.println( "Caught a BookException: " + ex.getMessage() );
      System.exit( 0 );
    }
    catch ( Exception ex )
    {
      System.err.println( "Caught an unexpected exception!" );
      ex.printStackTrace();
      System.exit( 1 );
    }
  }
}
```
Wenn ich den Client dann starte, bricht er mit folgender Fehlermeldung ab:
	
	
	
	





```
Caught an unexpected exception!
javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:247)
	at javax.naming.InitialContext.init(InitialContext.java:223)
	at javax.naming.InitialContext.<init>(InitialContext.java:197)
	at CartClient.main(CartClient.java:43)
Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:242)
	at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:42)
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
	... 4 more
```
Scheint also ein Problem mit der Referenz auf das Home-Interface zu sein.

Wo muß ich denn jetzt ansetzen, um den Fehler zu beheben....?


----------



## Romanticus (9. Okt 2007)

Ist wahrscheinlich schon längst nicht mehr aktuell, aber der JNDI Namensdienst läuft auf dem Port 1099 und nicht auf 8080.


----------

