JSF & EJB "Bean not bound" Problem

Status
Nicht offen für weitere Antworten.

Marsman

Bekanntes Mitglied
Hallo Ihr!

Wie ich in einem anderen Thread schon beschrieben hatte wollen wir hier in einem kleinen Übungsprojekt JSF und EJB3 nutzen. Ich habe dazu ein Tutorial unter Laliluna verwendet. Dabei wird über eine Entity-Bean auf die Datenbank zugegriffen. Der Zugriff darauf per Java-Client funktioniert auch. Ich habe nun einen Web-Client mit JSF programmiert. Dort erhalte ich allerdings leider den Fehler:

Code:
javax.servlet.ServletException: /test.jsp(13,1) '#{bookTestBean.first}' Error reading 'first' on type de.laliluna.library.BookTestBean
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

Das Server-Protokoll enthält u.a. (Die Null-Pointer-Exception bezieht sich auf em. Ich vermute, dass es ein Problem mit dem EntityManager gibt):


Code:
10:53:05,406 ERROR [JBossInjectionProvider] Injection failed on managed bean.
javax.naming.NameNotFoundException: de.laliluna.library.BookTestBean not bound
	at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)
	at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)
...
Caused by: java.lang.NullPointerException
	at de.laliluna.library.BookTestBean.getFirst(BookTestBean.java:59)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...

Ich habe versuchsweise mal in meine getFirst-Methode einen konstante String zurückgegeben. Also ohne Zugriff auf den Entity-Manager. Dann klappt es. Hier mein Bean-Code:

Code:
package de.laliluna.library;

import java.util.Iterator;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class BookTestBean implements BookTestBeanLocal, BookTestBeanRemote {

	@PersistenceContext
	EntityManager em;
	public static final String RemoteJNDIName = BookTestBean.class
			.getSimpleName()
			+ "/remote";
	public static final String LocalJNDIName = BookTestBean.class
			.getSimpleName()
			+ "/local";

	public void test() {
		Book book = new Book(null, "My first bean book", "Sebastian");
		em.persist(book);
                // Übrigen Code ausgelassen

	}

	public String getFirst() {
		List someBooks = em.createQuery("from Book b where b.author=:name")
				.setParameter("name", "Paul").getResultList();
		for (Iterator iter = someBooks.iterator(); iter.hasNext();) {
			Book element = (Book) iter.next();
			return element.toString();
		}
		return "Not Found!";
	}
}

Ich habe das EJB-Projekt und das Dynamic-Web-Projekt unter Eclipse für den JBoss 4.2 erstellt. Auf ein EAR-Projekt habe ich zunächst verzichtet, glaube auch nicht, dass das die Problemursache ist.

Ich würde mich riesig freuen, wenn mir da nochmal jemand einen Tipp geben könnte! 😀


Titus
 
Hallo Marsman,

kann dir nicht sagen wo das Problem ist, ich benutze kein EJB 3.0, hab vor ein paar Wochen mit EJB 2.1 + XDoclet angefangen.

Mein Tipp: Ohne Logging in der EJB bist du so gut wie Blind, debuggen fällt ja aus.

Ich benutzte log4j, zur Not würde es auch ein System.out.println tuen.

Damit könntest du ausgeben lassen, was denn genau null ist, der em, die query oder vielleicht die Liste?

Was steht den in Zeile 59?
 
Oh, sorry. Durch das kürzen des Codes sind hier im Firum die Zeilenummern verutscht. In Zeile 59 wird die Query erstellt. em ist leider beim Aufruf durch eine Web-Application null:

Code:
	public String getFirst() {
		String result = "Not Found!";
--->		EntityManager em = emf.createEntityManager();
		List someBooks = em.createQuery("from Book b where b.author=:name")
				.setParameter("name", "Paul").getResultList();
		Iterator iter = someBooks.iterator();
		if (iter.hasNext()) {
			Book element = (Book) iter.next();
			result = element.toString();
		}
		em.close();
		return result;
	}


Titus
 
...ich habe das Ganze nun statt auf dem JBoss auf dem Sun Applicationserver deploed. Auch dort bekomme ich beim Aufruf der JSF im Browser den Fehler, dass die Bean nicht instanziiert werden konnte. :-(
 
Schlage mich auch mit dem Zeug herum. Noch keine Lösung gefunden und in diversen Foren gibt es nur Fragen zu diesem Thema und keine Antworten. Frage mich, ob es überhaupt jemand zum Laufen gebracht hat?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben