JSF und Ausdrucksprache: Eigenschaft nur dann binden, wenn sie existiert

8

Was ist der beste Weg, um eine Datenspalte an eine Eigenschaft zu binden, die in der Datenquelle vorhanden ist oder nicht?

Dies ist beispielsweise der Fall, wenn Sie eine Klassenhierarchie haben, in der einige untergeordnete Elemente einem Subtyp angehören, der diese Eigenschaft besitzt. Die Datenquelle enthält verschiedene Unterklasse-Typen.

%Vor%

ergibt immer eine PropertyNotFoundException, wenn die Eigenschaft in keiner der Unterklassen vorhanden ist. Ich möchte die Eigenschaft nicht in die Basisklasse aufnehmen, da sie gemäß den Geschäftsregeln nicht vorhanden sein sollte.

Wie würden Sie dieses Problem lösen?

    
Falcon 11.04.2011, 09:19
quelle

5 Antworten

2

Ich denke, in einem solchen Fall ist es am besten, eine benutzerdefinierte Entität für die Ansichtsebene mit allen erforderlichen Feldern zu erstellen und die Elemente, die angezeigt werden sollen, zu konvertieren.

    
Falcon 13.04.2011, 11:58
quelle
7

Ohne die Klassen zu ändern, ist es am besten, eine Art instanceof in EL zu machen. Sie können das tun, indem Sie den (einfachen) Klassennamen überprüfen, wie er von Object#getClass() und dann Class#getName() oder Class#getSimpleName() in EL.

Angenommen, die Klasse mit der Eigenschaft hat den vollständigen qualifizierten Namen com.example.SubItem , hier ein Beispiel:

%Vor%

oder

%Vor%     
BalusC 11.04.2011 17:32
quelle
4

Als alternative Möglichkeit zum Bereitstellen von instanceof -Funktionalität in EL können Sie eine isInstanceOf() -Methode zu einer ApplicationScoped -Bohne hinzufügen. Ich benutze etwas wie:

%Vor%

dann rufe ich es von EL an wie:

%Vor%

Mit etwas Feinabstimmung kann diese Idee verallgemeinert werden, um den Aufruf irgendeiner statischen Methode von EL zu erleichtern.

    
par 19.03.2013 02:46
quelle
0

Warum haben Sie keine boolesche Eigenschaft der Basisklasse, die Ihnen sagt, ob Sie das tatsächliche Attribut in den Unterklassen haben oder nicht? Auf diese Weise können Sie den ternären Operator in Ihrem EL-Ausdruck wie folgt verwenden:

%Vor%

Das könnte funktionieren, wenn EL den Ausdruck träge auswertet, aber ich bin mir nicht sicher und kann es jetzt nicht überprüfen. Aber das ist eine Idee, mit der ich sowieso anfangen soll.

    
egbokul 11.04.2011 12:01
quelle
0

Abhängig von Ihrem Modell hier, denke ich, dass Sie vielleicht viel mehr Arbeit in der Backing-Bean machen wollen, anstatt zu versuchen, dass es auf der aktuellen JSF-Seite funktioniert.

Sie können die Tabelle einfach an die Bean als

binden %Vor%

und dann das Rendering tatsächlich in der Bean ausführen, indem Sie die Komponenten dynamisch hinzufügen usw. Wenn Sie das Modell trennen möchten und die Seite eine sehr kontrollierte Bean sein soll, dann sind die obigen Antworten wirklich mehr als das bin danach.

Alternativ wie vorgeschlagen, verwenden Sie einfach die gerenderte Eigenschaft und überprüfen Sie den Klassennamen (Vorsicht Nullzeiger). Ich mache beides regelmäßig, es hängt wirklich davon ab, wie viel komplexe boolesche Logik ich im eigentlichen JSF haben werde.

    
Daniel B. Chapman 11.04.2011 17:43
quelle

Tags und Links