# Eclipse Helios JNDI Lookup failed



## Erlo (12. Nov 2010)

Hallo,

ich arbeite mich gerade in EJB ein und baue zur Übung einen kleinen Rechner.

Dazu wurde in Eclipse ein EJB-Projekt erstellt und eine Klasse CalcImpl mit der funktionalität hinzugefügt

```
package ejb;

import java.io.Serializable;

import javax.ejb.Stateless;

@Stateless(mappedName="Firstcalc")

public class CalcImpl implements Calc, Serializable {
	

	/**
	 * 
	 */
	private static final long serialVersionUID = -2263711293220572497L;

	public float sum(float a,float b){
		return a+b; 
	}
	
	public float mult(float a,float b){
		return a*b; 
	}
	
	public float minus(float a,float b){
		return a-b; 
	}
	
	public float div(float a,float b) {
		try{
			return a/b;
		}
		catch(Exception e){
			System.out.println("Error:devision by 0!!");
			return 0;
		}
	}
}
```

das dazugehörige Remote Interface

```
package ejb;

import javax.ejb.Local;
import javax.ejb.Remote;

@Remote
@Local
public interface Calc  {
	
	public float sum(float a,float b);
	public float mult(float a,float b);
	public float minus(float a,float b);
	public float div(float a,float b);
}
```

Um dann damit zu Arbeiten habe ich ein Dynamic Web Project erstellt. Darin befindet sich ein einen einfache JSP und ein Servlet die mit dem EJB-Modul arbeiten. 

Aufruf des EJB-Moduls im Servlet:

```
Context ctx=new InitialContext();

			// call the calcImpl class of the SimpleCalculator EJB with the mappedName
			Calc cl=(Calc) ctx.lookup("Firstcalc");
```
(Das EJB-Projekt ist im Build Path hinzugefügt damit das Servlet die Klasse Calc kennt)


Beide Projekte  werden über "run on Server erfolgreich auf einen Glassfish-Server deployed 

Doch beim Aufruf der EJB im Servlet bekomme ich folgende Fehlermeldung im Serverlog:

INFO: Lookup failed for 'Firstcalc' in SerialContext 
SCHWERWIEGEND: javax.naming.NamingException: Lookup failed for 'Firstcalc' in SerialContext  [Root exception is javax.naming.NamingException: ejb ref resolution error for remote business interfaceejb.CalcRemote [Root exception is java.lang.ClassNotFoundException: ejb.CalcRemote]]

Irgendwie findet er nicht die Klasse im EJB-Modul und auch nach langer Recherche im Inet fand ich keine Lösung. Deswegen hoffe ich einer  von euch kann mir helfen!!


Danke im  Vorraus!
Erlo


----------



## 207 (12. Nov 2010)

heyho,

dein service interface hat remote _und_ local annotation? denke nicht das das funzt


----------



## 207 (12. Nov 2010)

nachtrag:

vielleicht das was du machen wolltest:

du erstellt ein remote (CalcRemote) und ein local (CalcLocal) interface. diese beiden implementierst du dann in deiner CalcImpl


----------



## Erlo (13. Nov 2010)

Hat leider nicht geholfen hier mal der ganze  Exception stack

```
INFO: Lookup failed for 'Firstcalc' in SerialContext 
SCHWERWIEGEND: javax.naming.NamingException: Lookup failed for 'Firstcalc' in SerialContext  [Root exception is javax.naming.NamingException: ejb ref resolution error for remote business interfaceejb.Calc [Root exception is java.lang.ClassNotFoundException: ejb.Calc]]
	at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442)
	at javax.naming.InitialContext.lookup(InitialContext.java:392)
	at javax.naming.InitialContext.lookup(InitialContext.java:392)
	at Web.CalcServlet.doPost(CalcServlet.java:65)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
	at java.lang.Thread.run(Thread.java:662)
Caused by: javax.naming.NamingException: ejb ref resolution error for remote business interfaceejb.Calc [Root exception is java.lang.ClassNotFoundException: ejb.Calc]
	at com.sun.ejb.EJBUtils.lookupRemote30BusinessObject(EJBUtils.java:430)
	at com.sun.ejb.containers.RemoteBusinessObjectFactory.getObjectInstance(RemoteBusinessObjectFactory.java:70)
	at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
	at com.sun.enterprise.naming.impl.SerialContext.getObjectInstance(SerialContext.java:472)
	at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:437)
	... 29 more
Caused by: java.lang.ClassNotFoundException: ejb.Calc
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at org.glassfish.web.loader.WebappClassLoader.findClass(WebappClassLoader.java:959)
	at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1430)
	at com.sun.ejb.EJBUtils.getBusinessIntfClassLoader(EJBUtils.java:678)
	at com.sun.ejb.EJBUtils.loadGeneratedRemoteBusinessClasses(EJBUtils.java:459)
	at com.sun.ejb.EJBUtils.lookupRemote30BusinessObject(EJBUtils.java:410)
	... 33 more
```


laut glassfish existieren auch die die JNDI Einträge

INFO: Portable JNDI names for EJB CalcImpl : [java:global/SimpleCalculator/CalcImpl!ejb.Calc, java:global/SimpleCalculator/CalcImpl]
INFO: Glassfish-specific (Non-portable) JNDI names for EJB CalcImpl : [Firstcalc, Firstcalc#ejb.Calc]
INFO: SimpleCalculator was successfully deployed in 8.331 milliseconds.

INFO: Portable JNDI names for EJB CalcImpl : [java:global/SimpleCalculator/CalcImpl!ejb.Calc, java:global/SimpleCalculator/CalcImpl!ejb.CalcLocal]
INFO: Glassfish-specific (Non-portable) JNDI names for EJB CalcImpl : [Firstcalc, Firstcalc#ejb.Calc]

mache ich was beim Deployen falsch?

EJB:
1. Eclipse EJB-Projekt erstellt
2. EJB Interfaces  und Klassen hinzugefügt
3. Das Eclipse EJB-Projekt über "Run on Server" auf den Glassfish deployed

WebInterface:

1. Eclipse Dynamic Web Project erstellt
2. JSP und Servlet erstellt
3. Das Eclipse EJB-Projekt in den Build Path hinzugefügt
4. Das Dynamic Web Projekt über "Run on Server " auf dem Glassfish deployed

Servlet:

```
package Web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import ejb.Calc;

/**
 * Servlet implementation class CalcServlet
 */
@WebServlet("/CalcServlet")
public class CalcServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CalcServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session=request.getSession(true);
		RequestDispatcher rd=this.getServletContext().getRequestDispatcher("/index.jsp");
		System.out.println(" Post Method test");
		float a=Float.parseFloat(request.getParameter("n1"));
		float b=Float.parseFloat(request.getParameter("n2"));
		char oper=request.getParameter("oper").charAt(0);
		float result=0;
		try {
			Context ctx=new InitialContext();

			// call the calcImpl class of the SimpleCalculator EJB with the mappedName
			Calc cl=(Calc) ctx.lookup("Firstcalc");
			
			switch(oper){
			
			case '+': result=cl.sum(a, b); break;
			case '-': result =cl.minus(a, b); break;
			case '*': result =cl.mult(a, b); break;
			case '/': result =cl.div(a, b); break;
			}
			session.setAttribute("result",result);
			System.out.println("Erg ist "+result+"!");
			request.setAttribute("a", 11);
			request.setAttribute("b", 11);
		}catch(NamingException e){
			session.setAttribute("erreur: ",e.getMessage());
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
		rd.forward(request,response); 
	}

	

}
```

Hier der Code als Anhang, vieleicht gibt es ja jemanden der es kurz testen kann.

1. EJB-Projekt
2. Dynamic Web Project


----------



## 207 (13. Nov 2010)

ok noch ein versuch:

das problem is clientseitig. 
du hast zwar im eclipse das ejb projekt dem web projekt hinzugefuegt.. damit hast du autocompletion etc und alles sieht wunderbar aus. aber beim deployen hat er noch nie was von deinem service interface gehoert weil das ejb projekt ja nicht mit exportiert wird.

versuch folgendes:

- entferne den ejb project aus dem web projekt path
- exportiere dein ejb projekt als jar..oder exportiere nur dein service interface als jar
- leg das jar in dein web porjekt -> webcontent -> web-inf -> lib ordner
- das jar ist nun automatisch im build path
( - evtl musst du noch im build path bei "export" -> "web app library" anhaken und damit exportieren...falls es nicht automatisch schon angehakt ist..keine ahnung)

vielleicht geht es so


----------



## Erlo (13. Nov 2010)

Super danke das mit dem Exportieren des Interfaces hat geklappt!:tollHätte ich auch selber drauf kommen müssen)
Das Tutorial nachdem ich diese Übung gemacht habe war dann nicht ganz vollständig.

Da ich alles ausprobieren wollte habe ich auch eine andere Art des EJB-Aufrufs ausprobiert.

Dazu habe ich die Servletklasse die Anotation @ EJB eingetragen
und die JNDI Context sachen gelöscht.


```
@EJB
private Calc cl;
```

Leider bekomme ich da folgende Fehlermeldung

```
SCHWERWIEGEND: Class [ LCalc; ] not found. Error while loading [ class Web.CalcServlet ]
WARNUNG: Error in annotation processing: java.lang.NoClassDefFoundError: LCalc;
```

Das L bei LCalc wird anscheinden von Eclipse selber durch einen Fehler eingefügt.Wie könnte man diesen Fehler selber bereinigen??


----------

