Geschachtelte JSF-Composite-Komponenten, die zu einer Stapelüberlauf-Ausnahme führen

8

Das Problem

Wenn ich versuche, eine Composite Component in sich selbst zu verschachteln, mit einer Logik, die die unendliche Rekursion beendet, erhalte ich eine Stapelüberlauf-Ausnahme. Mein Verständnis ist, dass <c:xxx> -Tags bei der Erstellung der Ansicht ausgeführt werden , so dass ich nicht erwartet habe, eine unendliche Ansicht zu erstellen, wie ich Vermutlich war der Fall.

Dies ist die zusammengesetzte Komponente simpleNestable.xhtml

%Vor%

So wird es verwendet

%Vor%

Die Stapelüberlaufausnahme

%Vor%

Die Frage

Wie kann ich zusammengesetzte Komponenten (oder ähnliches) in sich selbst verschachteln (in einer nicht vordefinierten Tiefe), ohne eine Stapelüberlauf-Ausnahme zu erhalten

Warum ich das möchte

Ich habe willkürlich Daten verschachtelt, die ich in einer verschachtelten faltbaren SubTabelle von RichFaces darstellen möchte, Alternativen zu meiner Vorgehensweise sind sehr willkommen

    
Richard Tingle 01.05.2015, 12:43
quelle

1 Antwort

6

Das Problem war im Zusammenhang mit #{cc} und der Aussagekraft des Attributs composite. Das #{cc} in einem beliebigen Attribut des verschachtelten Composites verweist auf selbst anstelle des übergeordneten Elements. Das Attribut, das statusbehaftet ist, bedeutet, dass #{cc} in jedem Kind neu ausgewertet wurde, das wiederum selbst anstelle des übergeordneten Elements referenziert. Daher der Stapelüberlauf. Es bewertet die Tiefe von sich selbst in einer Endlosschleife.

Ich habe die Eigenmächtigkeit des Attributs ausgetrickst, indem ich es mit einer Unterschriftskomponente wie unten statuslos gemacht habe, die es sofort auswertet und es als Komponenteneigenschaft zuweist:

%Vor%

Was in der componentType der Schnittstelle wie folgt deklariert werden soll:

%Vor%

Und in der Implementierung sollten Sie im Test auf die zustandslose Eigenschaft und in der verschachtelten zusammengesetzten Referenz auf die des übergeordneten Objekts verweisen (weil #{cc} im Attribut des verschachtelten Verbunds das verschachtelte Komposit selbst referenziert):

%Vor%

Ich habe hier nur die Bedeutung von "Tiefe" geändert, um umgekehrt zu sein, so dass es vom Client aus deklarativ ist, ohne dass es in der Implementierung bearbeitet werden muss. Also, im Client müssen Sie depth="#{3}" sagen, wenn Sie 3 verschachtelte Kinder haben wollen:

%Vor%

Beachten Sie, dass es sich hierbei eher um einen EL-Ausdruck als um ein Literal handelt. Andernfalls wird setValueExpression() in der Backing-Komponente nicht aufgerufen.

    
BalusC 01.05.2015, 13:46
quelle