# Problem mit jndi lookup



## boskop (1. Sep 2005)

Hallo, 

ich habe hier einen simplen client, der eine Session Bean aufruft, welche wiederum 2 Entity Beans aufruft. Das ganze läuft auf einem jboss 4.0.2.

wenn ich jetz aber im client programm das lookup mache erhalte ich immer folgende exception: javax.naming.NameNotFoundException: comp not bound

ich kann es beheben, indem ich "java:comp/env/ejb/TestCreator" mit "ejb/TestCreator" ersetze, aber ich finde es komisch, dass es in der Session Bean genau so aber funktioniert, also ich erhalte die Ref auf die Entity Beans mit "java:comp/env/ejb/EntityBeansName"

Hier mein client Code:


```
private static final String TESTCREATOR_HOME = "java:comp/env/ejb/TestCreator";

    public static void main(String[] args) {
        Context jndiContext = null;
        try {
            jndiContext = getInitialContext();
            Object ref = jndiContext.lookup(TESTCREATOR_HOME);
            TestCreatorHome home = (TestCreatorHome) PortableRemoteObject
                    .narrow(ref, TestCreatorHome.class);
            System.out.println("Got home.");
            TestCreator creator = home.create();
            
            System.out.print("Creating customer...");
            creator.createCustomer();
            System.out.println("done.");
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (jndiContext != null) {
                try {
                    jndiContext.close();
                } catch (Exception ex1) {
                }
            }
        }
    }
    
    private static Context getInitialContext() throws Exception {
        Properties env = new Properties();
        env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        env.setProperty(Context.PROVIDER_URL, "jnp://localhost:1099");
        return new InitialContext(env);
    }
```

Sieht jemand gerade eine Lösung? Lauffent würde es ja, aber ich fände es schöner, wenn ich es überall gleich mache.

Danke

boskop


----------



## Guest (1. Sep 2005)

Das ist schon korrekt so. Von aussen ist der lokale JNDI Name und auch 
die lokalen Interfaces nicht sichtbar.
Die lokalen JNDI Namen sind nur innerhalb der gleichen VM gültig, also
innerhalb des Application Servers.


----------



## Gumble (1. Sep 2005)

Vielleicht hilft dieser Artikel: http://www.javaworld.com/javaworld/jw-07-1999/jw-07-cooltools.html


----------



## Bleiglanz (1. Sep 2005)

jo, der Client hat ja erstmal keinen ENC

deshalb ist das präfix java:comp/env erstmal sinnlos

=> aber es gibt ja noch die "Application-Container"...


----------



## boskop (1. Sep 2005)

ja stimmt, ihr habt natürlich alle recht.

danke für die anworten.

Boskop


----------



## bronks (5. Sep 2005)

boskop hat gesagt.:
			
		

> ... ich kann es beheben, indem ich "java:comp/env/ejb/TestCreator" mit "ejb/TestCreator" ersetze, ...


Der Thread ist interessant und mir ist etwas vergleichbares vorgekommen. Wenn ich mich an diesem Beispiel richte, dann darf ich im LookUp nur nach "TestCreator" ohne "ejb/" suchen, damit es funktioniert. Auf dem SunAS kann ich mit "ejb/TestCreator" suchen und auf dem JBoss nur mit "TestCreator". 

Das ganze ist eine kleine funktionierende App, die auf dem SunAS8.1 mit einem Webmodul läuft. In dem Webmodul wird im Lookup nach "java:comp/env/ejb/facadeBean" gesucht. In der ClientApp, welche ich nur zum Spaß erstellt habe, für den SunAS mache ich einen Lookup mit "ejb/facadeBean" und es funktioniert alles wie es soll und wie von euch beschrieben.

Auf dem JBoss4.0.2: Das EJB-Modul ist am laufen und kommuniziert mit unverändertem Webmodul einwandfrei. In der ClientApp muß ich den Lookup nur mit "facadeBean" machen, denn sonst geht nichts. 

Kann mir bitte jemand erklären, warum ich mir im JBoss auch den ejb-Präfix schenken muß?

Auszug aus dem Clientcode:

```
Properties env = new Properties();
        env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        //env.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
        env.setProperty(Context.PROVIDER_URL, "jnp://localhost:1099"); 
                        
            Context initial = new InitialContext(env);
            Object objref = initial.lookup("java:facadeBean");
```


----------



## Bleiglanz (5. Sep 2005)

und was steht in der jboss.xml beim "physikalischen" JNDI Namen?

(wahrscheinlich nix, dann nimmt der JBoss einfach den Klassennamen und macht eben kein "/ejb/" davor hin...


----------



## bronks (5. Sep 2005)

@Bleiglanz:
Vielen Dank! Deine Annahme war richtig.


----------

