EJB - EJB wird nicht ins Servlet geladen

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
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:
Code:
@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:
Code:
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​
Code:
<!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
Code:
@Local
public interface HelloUser {
    public String createHello(String username);
}
HelloUserBean
Code:
@Stateless
public class HelloUserBean implements HelloUser {
    public String createHello(String username) {
        return "Hello: " + username;
    }
}

helloworld.war

HelloController
Code:
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
Code:
<%--

--%>
<%@ 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
Code:
<?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>
 
Zwei möglichkeiten:

Entwerder über ein
Code:
InitialContext ctx;
ctx.lookUp(JNDIName);
oder

dein EJB Mapping dann aber

Code:
@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ß
 
Danke, aber der findet das irgendwie nicht.
Muss ich in der web.xml noch irgendwas mit jndi angeben ?
 
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

Code:
<?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.

Code:
    <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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben