# Frage zu JNDI



## 2AndAHalfBit (1. Nov 2011)

Hallo zusammen, 

ich habe folgende Situation:

Anwendungsserver: Glassfish 3.1 (Community edition)
Installierte Anwendung: Protudo.ear
In Protudo.ear ist eine Jar mit den EJB's enthalten: Protudo-EJB.jar

Meine Bean heisst ProdudoSessionBean und liegt im package server.application. 
Sie implementierung sowohl das Remote als auch das lokale Business Interface. 

Im Internet habe ich folgende Regel für den JNDI lookup name gefunden:



> The syntax for portable global session bean JNDI names in EJB 3.1 is :
> java:global[/<app-name>]/<module-name>/<bean-name>



Ich möchte von einem Remoteclient (Swing) auf die Bean zugreifen. 
Der folgende Code:


```
private ProtudoSessionFacadeDelegate() throws NamingException
	{
		context = new InitialContext();
		protudoSessionFassade = (ProtudoRemoteSessionFacadeInterface) context.lookup("java:global/Protudo/Protudo-EJB/ProtudoSessionBean");
	}
```

führt jedoch zu der exception



> javax.naming.NamingException: Lookup failed for 'java:global/Protudo/Protudo-EJB
> /ProtudoSessionBean' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700,
> java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory,
> org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.url.pkgs=com.sun.ent
> ...



ist mein Lookup String falsch? Wenn ja, was genau ist falsch? 

Grüße und danke für eure Antworten.


----------



## TheDarkRose (1. Nov 2011)

Hast du es schon mal versucht, mit der Interfaceangabe einen Lookup durchzuführen?


----------



## 2AndAHalfBit (1. Nov 2011)

Hallo, 

nein, aber habe es gerade mal nachgeholt. Funktioniert aber genauso wenig. 



> javax.naming.NamingException: Lookup failed for 'java:global/Protudo/Protudo-EJB
> /ProtudoRemoteSessionFacadeInterface' in SerialContext[myEnv={org.omg.CORBA.ORBI
> nitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.SerialIni
> tContextFactory, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.url
> ...



grüße


----------



## fastjack (1. Nov 2011)

Gibt es so eine Art Webconsole beim Glassfisch, wo Du sehen kannst, welche EJB welchen Namen haben? Anonsten kannst Du mal im InitialContext die list()-Methoden probieren, vielleicht bringst was.


----------



## 2AndAHalfBit (1. Nov 2011)

Meinst du mit Webkonsole die webseite, die über port 4848 erreichbar ist? Da habe ich schon reingeschaut. Leider gibt es dort keine Einträge. Ist da generell was falsch?!

Beim Starten des Applikationsservers gibt es folgende Ausgaben:



> [#|2011-11-01T21:15:17.738+0100|INFO|glassfish3.1.1|javax.enterprise.system.tools.admin.org.glassfish.deployment.admin|_ThreadID=61;_ThreadName=AutoDeployer;|Protudo was successfully deployed in 18.596 milliseconds.|#]
> 
> [#|2011-11-01T21:15:17.739+0100|INFO|glassfish3.1.1|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=61;_ThreadName=AutoDeployer;|[AutoDeploy] Successfully autodeployed : C:\java\glassfish\domains\domain1\autodeploy\Protudo.ear.|#]
> 
> ...



List probiere ich gerade noch aus.
Grüße

//Edit. Die List methoden erwarten einen String als Parameter. Was soll ich dort übergeben?


----------



## TheDarkRose (1. Nov 2011)

In deiner Webconsole steht eh schon wie deine JNDI-Lookups aussehen zu haben. Beim der Interface Angabe nach dem ! ist zu beachten, das der ganze Packagename mit soll, im Unterschied zu der Beanangabe,

```
java:global/Protudo/Protudo-EJB/ProtudoSessionBean!server.interfaces.business.ProtudoRemoteSessionFacadeInterface
```


----------



## 2AndAHalfBit (2. Nov 2011)

Hi, 

danke, aber die Einträge hatte ich schon als erstes ausprobiert. Leider ohne Erfolg.
Grüße


//edit exception stack changed 


> javax.naming.NamingException: Lookup failed for 'java:global/Protudo/Protudo-EJB
> /ProtudoSessionBean!server.interfaces.business.ProtudoRemoteSessionFacadeInterfa
> ce' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.facto
> ry.initial=com.sun.enterprise.naming.SerialInitContextFactory, org.omg.CORBA.ORB
> ...


----------



## TheDarkRose (2. Nov 2011)

In welchem Projekt leigen die Interfaces? Werden diese in das /lib Verzeichnis der EAR deployed? denn laut deiner Exception findet Glassfish die Interfaces nicht.


----------



## 2AndAHalfBit (2. Nov 2011)

Nein, ich verwende einen DeploymentDescriptor (application.xml) mit folgendem Inhalt:

[XML]
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:application="http://java.sun.com/xml/ns/javaee/application_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd">
  <display-name>anzeigenverwaltung</display-name>
  <module>
    <ejb>Protudo-EJB.jar</ejb>
  </module>
  <module>
    <web>
      <web-uri>Protudo.war</web-uri>
      <context-root>protudo</context-root>
    </web>
  </module>
</application>
[/XML]

die EJB's befinden sich in der Datei Protudo-EJB.jar (in der Protudo.ear), jedoch gibt es dort kein lib-Verzeichnis. Die jar beinhaltet direkt die packages.

Ist das falsch? wird ein lib-Verzeichnis benötigt?
Greetings.


----------



## TheDarkRose (2. Nov 2011)

Deine Interfaces befinden sich in der Protudo-EJB.jar? DAS war meine Frage.


----------



## 2AndAHalfBit (2. Nov 2011)

Achso, ja. 
In meiner Jar befinden sich alle Serverklassen. Sprich die Schnittstellen eine managed bean für den webzugriff und die konkreten Session und entity beans.

grüße


----------



## FArt (3. Nov 2011)

glassfish list jndi entries - Google-Suche


----------



## 2AndAHalfBit (3. Nov 2011)

Hallo FArt, 

danke für deine Mühe. Aber ich denke, wir haben den lookupstring schon gefunden. Jedoch gibt es noch ein Problem, und ich glaube das hat mit meinem Deployment zu tun. Zuletzt gab es keine NamingException, er findet einfach die Klasse nicht. 

Nun stellt sich nur noch die Frage warum. 

übrigens:



> C:\java\glassfish\bin>asadmin list-jndi-entries
> java:global: com.sun.enterprise.naming.impl.TransientContext
> UserTransaction: com.sun.enterprise.transaction.TransactionNamingProxy$UserTrans
> actionProxy
> ...



Die EJB wird gefunden.


----------



## 2AndAHalfBit (5. Nov 2011)

Hi @All, 

ich schäme mich. Es funktioniert nun. Ich habe vergessen, die Schnittstellen an den Client auszuliefern. Deswegen konnte er die Schnittstellen auch nicht finden -

Hier der Code des Business Delegates (Er übernimmt die Kommunikation mit dem server lt. J2EE Entwurfsmuster)


```
package client.application;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import server.interfaces.business.ProtudoRemoteSessionFacadeInterface;

public class ProtudoSessionFacadeDelegate
{
	private static ProtudoSessionFacadeDelegate Instance;
	
	private InitialContext context;
	private ProtudoRemoteSessionFacadeInterface protudoSessionFassade;
	
	
	private ProtudoSessionFacadeDelegate() throws NamingException
	{
		context = new InitialContext();
		protudoSessionFassade = (ProtudoRemoteSessionFacadeInterface) context.lookup("java:global/Protudo/Protudo-EJB/ProtudoSessionBean!server.interfaces.business.ProtudoRemoteSessionFacadeInterface");
		System.out.println("EJB has been connected.");
	}
	
	
	public static ProtudoSessionFacadeDelegate GetInstance() throws NamingException
	{
		if( Instance == null)
			Instance = new ProtudoSessionFacadeDelegate();
		
		return Instance;
	}
	
	public String GetTestString()
	{
		return protudoSessionFassade.GetDummyString();
	}
}
```

Danke für eure Hilfe, und viele Grüße. 
Es wäre auch nett wenn ihr mich beim Thema Dependency Injection auch noch etwas unterstützen könntet. 

Eine Sache noch: Wie schalte ich das Thema auf erledigt?

Grüße


----------

