Probleme mit JSF und ManagedBean

Fabi_3011

Neues Mitglied
Programmiere gerade das erste mal Java EE und hab mittlerweile erste Probleme mit JSF. JSP und Servlet etc sind kein Problem aber bei JSF steig ich nicht durch. Wir sollen als Studienarbeit eine Seite programmieren die sämtlich Abgeordnete des Bundestags anzeigt. Dabei soll die Partei Anzeige mit JSF gemacht werden. Derzeit benutze ich eine Entität Partei, die JSF Seite Partei.jsp und die ManagedBean ParteiBean.

Dabei bekomme ich den Fehler das die Bean nicht gefunden werden kann.
Web.xml

[XML]<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Bundestag_Web</display-name>

<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>

</web-app>[/XML]

Faces-config.xml

[XML]<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
<managed-bean>
<managed-bean-name>parteiBean</managed-bean-name>
<managed-bean-class>de.fabian_bloss.beans.ParteiBean</managed-bean-class>
<managed-bean-scope>view</managed-bean-scope>
<managed-property>
<property-name>partei</property-name>
<property-class>de.fabian_bloss.entities.Partei</property-class>
<value></value>
</managed-property>
</managed-bean>

</faces-config>[/XML]


Partei.jsp(JSF Seite)

Code:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f"  uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h"  uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Parteien</title>
</head>
<body>
<f:view>
    <h:outputText value="#{parteiBean.partei }"/>
</f:view>
</body>
</html>
Managed Bean: ParteiBean

Java:
@ManagedBean(name="parteiBean")
@ViewScoped
public class ParteiBean 
{
    @ManagedProperty(value="#{partei}")
    Partei partei;

    private void loadPartei()
    {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("Bundestag_Web");
        EntityManager em = emf.createEntityManager();

        setPartei(em.find(Partei.class, 5));

        emf.close();
        em.close();
    }

    public Partei getPartei() {
        loadPartei();
        return partei;
    }

    public void setPartei(Partei partei) {
        this.partei = partei;
    }
}
Im Endeffekt soll die JSF Seite eigentlich nur die Bean erstellen und dort die Partei auslesen. Aber ich bekomm immer wieder den Fehler

Code:
javax.servlet.ServletException: Verwalteter Bean parteiBean kann nicht erstellt werden. Die folgenden Probleme wurden gefunden:
     - Bean- oder Eigenschaftenklasse beans.ParteiBean für verwalteten Bean parteiBean kann nicht gefunden werden.

Da ich ein kompletter Anfänger in der Java EE Programmierung bin und bis jetzt auch noch nichts im Netz gefunden hab, was mit weiterhilft. Hoff ich das jemand den Fehler sieht. Danke 🙂
 
Zuletzt bearbeitet:
Ursache für den Fehler st vermutlich die falsch benutzte
Code:
@ManagedProperty
-Annotation, aber auch sonst geht da mMn einiges schief..

  • Die managed-bean Bekanntmachung kannst du in der
    Code:
    faces-config
    komplett weglassen. Dafür hast du die
    Code:
    @ManagedBean
    -Annotation direkt in der Bean selbst.
  • Code:
    Partei
    ist offenbar eine Entity-Klasse. Da hat die
    Code:
    @ManagedProperty
    -Annotation nichts verloren. Diese nimmst du, wenn du eine Bean innerhalb einer anderen benutzen möchtest. Also auch streichen..
  • In getter- und setter würde ich keine Logik hineinpacken. Das Laden der Partei kannst du zunächst einfach in den Konstruktor packen. Beim Instanzieren der Bean wird implizit der default-Konstruktor aufgerufen.
  • Deine JSF-Seite sieht mir nach einer JSP-Seite aus. Als JSF-Seite sollte diese eher ungefähr so aussehen:
    HTML:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:f="http://java.sun.com/jsf/core"      
          xmlns:h="http://java.sun.com/jsf/html">
    
        <h:body>
        	<h:outputText value="#{parteiBean.partei}"/>
        </h:body>
    </html>
    ...und dann als xyz.xhtml abgespeichert werden.

Interessant wäre, falls das alles noch nicht hilft, außerdem noch, aus welchen Paketen du die Annations importierst.
 
Zuletzt bearbeitet:
Danke :toll: funktioniert mittlerweile.
Lag iwie an eclipse. Die ManagedBean wurde nicht mit in die WAR gepackt.
Die ManagedBean haben wir so gelernt, aber gut zu wissen das einmalige Annotation auch reicht.
Das laden der Entität hab ich gestern auch noch in den Konstruktor.

Das mit JSF Seite als xhtml is mir nur grad neu. Wir haben es in eclipse als JSP und da erscheint mir automatisch der oben stehende code. Von daher wusste ich das nicht mal. Aber hab im Netz gerade auch überall gelesen, das JSF eigentlich eine .xhtml Seite ist. Komisch nur das wir es dann so lernen.
 
Es deutet vieles daraufhin, dass euer Dozent wohl selbst noch mit einer 1er-Version von JSF gearbeitet/gelernt hat. Seit JSF 2.0 hat sich einiges getan und ist deutlich komfortabler geworden. So zum Beispiel die mächtigen Annotationen, die ein Bearbeiten der faces-config nahezu unnötig machen. Auch Eclipse ist schon so weit, dass es per Annotation bekanntgemachte Beans unterstützt (Codevervollständigung usw..) Seit der 2er Version setzt JSF auch auf Facelets als render-technologie, seither haben jsp da eigentlich nichts mehr verloren...
Im Netz geistert verständlicherweise aber auch noch viel zu den alten JSF-Version herum, so dass man am Anfang gar nicht so recht weiß, was nun tatsächlich von Bedeutung ist und man neigt zu Beginn dann doch oftmals dazu ein riesiges Kauderwelsch zu programmieren. Du solltest jedenfalls direkt mit dem neuen Krams einsteigen und darauf achten, dass du auch eine aktuelle JSF Version (z.B. Mojarra 2.1.28 oder 2.2.7) verwendest, da die alten doch noch recht fehlerbehaftet sind. GlassFish wird z.B. von Haus aus mit Mojarra 2.1.6 ausgeliefert, die Version kannst du z.B. vergessen...
Aber genug vorerst, will dich auch nicht noch mehr mit weiteren Begriffen erschlagen, dir raucht vermutlich so schon ein wenig der Kopf 🙂 Bei weiteren Fragen, frag aber einfach nochmal nach.
 

Neue Themen


Zurück
Oben