# EJB - EJB wird nicht ins Servlet geladen



## Guest (15. Nov 2007)

Hi


Ich versuche mich schon seid einiger Zeit mit EJB3 - vergebens. Irgendwie will das einfach nicht. Irgendwie erkennt er das EJB nicht. Wenn ich das richtig verstanden habe sollte die EJB Umgebung die Initialisierung meiner Beans übernehmen. Das sieht bei mir folgendermassen aus:

```
@EJB    
private HelloUserBean helloUserBean;
```
Leider funktioniert das anscheinend nicht. Er läd das Bean nicht und es wird dementsprechend eine Null PointerException geworfen. Habe die Zeile  ROTmarkiert, wo 

Ich aus dem Buch "EJB in Action" entnommen habe, dass eine Annotation von @EJB vollkommen ausreicht. Leider gibt das Buch nicht her, wie die Einbindung genau auszusehen hat. Naja....genau das was ich eigenltlich brauche (Muss ich doch mit JNDI arbeiten ?) 


Die WebApp funktioniert einwandfrei. Also JSP läuft und das HttpServlet auch 

Ich hoffe das mir einer weiterhelfen kann. Leider habe ich im Internet für mich kein passendes Beispiel gefunden. So wie es aussieht erkennt JBoss das EJB:
Auszug aus dem MBean Inspector:

```
JMX MBean View 

MBean Name: Domain Name: jboss.j2ee 
 service:  EJB3 
 name:  HelloUserBean 
 ear:  helloworld.ear 
 jar:  helloworld.jar 
MBean Java Class: org.jboss.ejb3.stateless.StatelessDelegateWrapper 

Back to Agent View  Refresh MBean View
```

*Meine Applikation:*
Ich habe die Datei hellworld.ear erstellt. Die Datei enthält 
helloworld.war (WebApp)
helloworld.jar (EJB)
META-INF/application.xml


application.xml​

```
<!DOCTYPE application PUBLIC "-//Sun Microsystems,
Inc.//DTD J2EE Application 1.2//EN"
        "http://java.sun.com/j2ee/dtds/application_1_2.dtd">
<application>
    <icon>
    </icon>
    <module>
        <ejb>helloworld.jar</ejb>
    </module>
    <module>
        <web>
            <web-uri>helloworld.war</web-uri>
            <context-root>/helloworld</context-root>
        </web>
    </module>

    <display-name>Hello World EJB3</display-name>
    <description>Hello World EJB3</description>
    <!-- <security-role>
        <description>the customer role</description>
        <role-name>customer</role-name>
    </security-role>
    -->
</application>
```

*helloworld.jar*

HelloUser 

```
@Local
public interface HelloUser {
    public String createHello(String username);
}
```
HelloUserBean 

```
@Stateless
public class HelloUserBean implements HelloUser {
    public String createHello(String username) {
        return "Hello: " + username;
    }
}
```

*helloworld.war*

HelloController 

```
public class HelloController extends HttpServlet {
    public static LinkedHashMap<String, Integer> counter = new LinkedHashMap<String, Integer>();
    @EJB    
    private HelloUserBean helloUserBean;

    public String createHello(String username) {

        try {
             [COLOR="Red"]// HIER IMMER NULLPOINTEREXCEPTION[/COLOR]
            return helloUserBean.createHello(username); 

        } catch (Exception e) {
            e.printStackTrace();
        }

        return "No Hello for you ";
    }

    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
            throws ServletException, IOException {
       Integer count = counter.get(request.getParameter("name"));
       if(count==null)
            count = 0;
       counter.put(request.getParameter("name"), ++count);
       response.sendRedirect("index.jsp?ejbname="+createHello("Mr.Help")+"&name=" + request.getParameter("name") + "&count="+count) ;
    }

    public void doPost(HttpServletRequest request,
                       HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
```

*index.jsp*

```
<%--

--%>
<%@ page contentType="text/html;charset=ISO-8859-1" language="java" %>
<html>
<head><title>Hello EJB3 World </title></head>
<body>
<%
    if  (request.getParameter("name")!=null ) {
        out.println("Hallo: " + request.getParameter("name"));
        out.println("Dies ist ihr " + request.getParameter("count") + ". Besuch");
    }
%>
<form action="HelloWorld.form" method="POST">
    <input type="text" name="name" SIZE=25>
    <input type="reset" name="reset" VALUE="Löschen">
    <input type="submit" NAME="submit" VALUE="Sag Hallo">
</form>

[url="Statistik.stat"]Statistik[/url]

<%
   out.println("EJB " + request.getParameter("ejbname") + " Parabens");
%>

</body>
</html>
```


*web.xml*

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <display-name>hnejb3</display-name>

    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>hn.ejb.example01.web.HelloController</servlet-class>
    </servlet>

      <servlet>
        <servlet-name>Statistik</servlet-name>
        <servlet-class>hn.ejb.example01.web.StatistikServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>*.form</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>Statistik</servlet-name>
        <url-pattern>*.stat</url-pattern>
    </servlet-mapping>
</web-app>
```


----------



## JimPanse (16. Nov 2007)

Zwei möglichkeiten:

Entwerder über ein 

```
InitialContext ctx;
ctx.lookUp(JNDIName);
```
oder 

dein EJB Mapping dann aber


```
@EJB(mappedName =JNDI_NAME_PRAEFIX
            + "DieBeandiedasInterfaceImplementiert/DieSchnittstelleAufDieZugegriffenwerdenMuss", beanName = "DieBean")

in deinem Falle

@EJB(mappedName = "HelloUser /local", beanName =   "HelloUserBean ")
```

Das sollte klappen, dann kannst du auf das LocalInterface zugreifen!


Gruß


----------



## Guest (16. Nov 2007)

Danke, aber der findet das irgendwie nicht.
Muss ich in der web.xml noch irgendwas mit jndi angeben ?


----------



## Guest (16. Nov 2007)

Habe es hinbekommen -   :applaus: 
Wenn ich das richtig verstanden habe, hat Tomcat5.5 wohl Probleme mit den Annotationen und man muss mit dem JNDI arbeiten. Allerdings musste ich dann noch die jboss-web.xml erstellen


```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC
    "-//JBoss//DTD Web Application 4.2//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">
<jboss-web>
	<context-root>StatelessWeb</context-root>
	<ejb-local-ref>
		<ejb-ref-name>ejb/HelloUserLocal</ejb-ref-name>
		<local-jndi-name>helloworld/HelloUserBean/local</local-jndi-name>
	</ejb-local-ref>
</jboss-web>
```

Und die web.xml anpassen.


```
<ejb-local-ref>
		<ejb-ref-name>ejb/HelloUserLocal</ejb-ref-name>
		<ejb-ref-type>Session</ejb-ref-type>
		<local-home>java.lang.Object</local-home>
		<local>hn.ejb.example01.beans.HelloUserBean</local>
	</ejb-local-ref>
```

Weiss nicht ob das alles so die "beste" Lösung ist.. Aber es funtzt
@JimPanse
Besten dank für den Hinweis mit JNDI


----------

