JSF (Grundlegendes) import bei xhtml?

moresekt

Mitglied
Hallo Allerseits,

ich habe folgendes Codesnipped:

Java:
            <h:dataTable id="tResults" var="res" value="#{searchBean.searchResults}">
                <h:column>
                    <h:outputText value="#{res.name}"/>
                </h:column>
				<h:column>
					[...]
				</h:column>
            </h:dataTable>

searchBean.searchResults returned Iterator<Resource>, d.h. "res" ist vom typ Resource (eigene Klasse von mir). Die Klasse Resource hat das Attribut "name" mit entsprechendem getter/setter. Ich möchte eigentlich eine Liste mit allen Resourcen (bzw. deren Namen) und anderen Attributen darstellen.

Bei JSP hätte ich am Anfang <%@page import="meinPackage.Resource;"%> geschrieben. Wie läuft das bei JSF/Facelets? Mir fehlt irgendwie das grundlegende Verständnis.

Ich erhalte folgende Fehlermeldung:
Java:
SCHWERWIEGEND: javax.el.PropertyNotFoundException: /index.xhtml @35,56 value="#{res.name}": The class 'java.util.AbstractList$Itr' does not have the property 'name'.

Ich freue mich über Hilfe :) Vielen Dank im Voraus.
 
Zuletzt bearbeitet:

nocturne

Bekanntes Mitglied
Hallo,

der Import beschreibt ja Package und Klassennamen ohne Instanz.
Dieses "Verweisen" auf eine Klasse gibt es in JSF nicht, dafür gibt es das Verweisen auf eine Objektinstanz die sich in der Session befindet!

Du kannst in JSF keine Instanz erzeugen - zumindest nicht direkt.
Das instanz-Erzeugen musst du den Klassen in der Session überlassen!

Offensichtlich hast du bereits eine Klasseninstanz von searchBean, diese hast du vermutlich in der faces-config.xml konfiguriert.

Im unterschied zu JSP wird nicht der Methodenname verwendet, sondern sogenannte Propertys (Bean-felder).

Die Fehlermeldung sagt in Zeile 3: Du hast da ein Objekt im Iterator, das keine public-Methode getName() hat!

Wenn du möchtest, machen wir eine TeamViewer-Session.
 

moresekt

Mitglied
Hi Nocturne, danke für die Antwort. Das mit TeamViewer geht leider nicht, da ich das ganze auf Arbeit (Werkstudent^^) mache und TeamViewer gegen den Datenschutz verstößt.

SearchBean habe ich als @ManagedBean definiert. Ich habe in SearchBean diverse Attribute, die sich alle fehlerfrei returnen lassen. Unter anderem auch "Iterator<Resource> searchResults" mit dem getter "public Iterator<Resource> getSearchResults(){...}". Die Klasse "Resource" hat eine public getName() methode. Deshalb versteh ich das Problem leider noch nicht so richtig, da es ja eine Instanz von Iterator<Resource> gibt.

Ich habe gerade in der searchBean eine methode "public Resource getTestResource()" geschrieben. Wenn ich dann in der xhtml "<h:eek:uputText value="#{searchBean.testResource.name}" schreibe, klappt alles. Also irgendwie liegt es am Iterator. Aber mit h:dataTable ist ja extra für Iteratoren oder Collections :/


Edit: Meine SearchBean.java sieht in etwas so aus:
Java:
import com.[...].Resource;
//noch mehr imports...

@ManagedBean
@SessionScoped
public class SearchBean implements Serializable {

    [...]
    private Iterator<Resource> searchResults;

    public Iterator<Resource> getSearchResults() {
        return searchResults;
    }

    public void berechneSearchResults(){    
       searchResults = new [...]
       //hier noch irrelevanter Code
   }



--------------- EDIT2:

"Grund hierfür ist dass das JSF-Tag <h:dataTable> scheinbar nicht über einen Generic-Iterator laufen kann, wohl aber über ein Array. "
Quelle: Java Server Faces (Basics)

--> d.h. ich muss erst jedes Element aus dem Iterator in eine Liste kopieren. Bei großen Listen wird das ganzschön lange dauern. Falls jemand ne Möglichkeit kennt Iteratoren doch mit h:dataTable anzeigen zu lassen, bitte melden :)
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben