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?
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:
oder
%Vor% 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:
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.
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.
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.