JSF 2 Benutzerdefinierte Komponenten mit Expression-Sprache für Attributwerte lösen den Attribut-Setter nicht aus

8

Ich habe eine benutzerdefinierte Komponente in JSF 2.0 erstellt

Das Tag sieht so aus:

%Vor%

Die entsprechende Java-Klasse:

%Vor%

Wenn ich

verwende %Vor%

Alles funktioniert wie erwartet, aber wenn ich EL für myTag-Attribute verwende, wird die Methode setName() niemals aufgerufen. Also für,

%Vor%

Ich erhalte immer null für die name Eigenschaft innerhalb meiner encodeBegin Methode. Nach dem Debuggen ist mir aufgefallen, dass die Methode setName niemals aufgerufen wird. Ich dachte, dass etwas in Bezug auf EL Dinge vermasselt (und ich glaube immer noch, dass der Grund damit zusammenhängt), aber was wirklich seltsam ist, ist dass die id Eigenschaft gut funktioniert: der Setter wird aufgerufen, und der Wert ist wie erwartet Die Prüfung beginnt.

Ich muss erwähnen, dass wenn ich getAttributes().get("name") von der Methode encodeBegin aufruft, bekomme ich den korrekten Namen Wert, aber ich bin fasziniert, warum es nicht mit Getter und Setter funktioniert.

Irgendwelche Ideen, was meiner Komponente fehlt?

    
RaresI 08.08.2012, 14:40
quelle

1 Antwort

12

Dieses Verhalten wird erwartet und nach Spezifikation. Attributwerte, die Wertausdrücke sind, werden von UIComponent#setValueExpression() . Sie sollen nämlich nur dann ausgewertet werden, wenn sie wirklich verwendet werden, normalerweise während der Renderzeit der Ansicht.

Das Attribut id (und binding ) hat eine spezielle Behandlung: Es wird während der Aufbauzeit ausgewertet, bevor es gesetzt wurde, also würde der "reguläre" Setter anstelle von% co_de aufgerufen werden % (weil das Rendern der Ansicht andernfalls abstürzen würde, wenn das Attribut setValueExpression() (oder id ) dynamisch aus anderen Gründen einen anderen Wert als während der Ansichtsgenerierungszeit auswertet).

Besser ist es, die Getter / Setter zu zu delegieren binding anstelle von lokalen Eigenschaften. Das UIComponent#getStateHelper() endet schließlich auch in setValueExpression() (beachten Sie, dass es den Setter überhaupt nicht aufruft; rufen Sie einfach den Getter, wenn Sie die Daten benötigen) und das StateHelper löst auch die Werte von getAttributes() .

%Vor%

Beachten Sie, dass Sie die Methoden StateHelper und getId() sicher entfernen können, da sie bereits in der übergeordneten Klasse setId() definiert sind.

    
BalusC 08.08.2012, 16:13
quelle