2010-11-12 6 views
5

Ich muss polymorphe Entitäten anzeigen/bearbeiten.Wie behandelt man Polymorphismus mit JSF2?

Meine abstrakte Klasse ist Person. Meine konkreten Klassen sind PhysicalPerson und MoralPerson

Jede konkrete Klasse hat ihre eigene benutzerdefinierte Attribute.

Wie kann ich die entsprechende Anzeige/Bearbeitung (Composite) -Komponente nach Entity-Klasse verwenden?

Danke! :)

Antwort

4

Es gibt keine instanceof in EL. Sie können jedoch (ab) Object#getClass() verwenden und auf die Getter von Class in EL zugreifen. Dann ermitteln Sie einfach das Ergebnis im Attribut rendered der Komponente.

<h:panelGroup rendered="#{entity.class.name == 'com.example.PhysicalPerson'}"> 
    <p>According to Class#getName(), this is a PhysicalPerson.</p> 
</h:panelGroup> 
<h:panelGroup rendered="#{entity.class.simpleName == 'MoralPerson'}"> 
    <p>According to Class#getSimpleName(), this is a MoralPerson.</p> 
</h:panelGroup> 

Eine benutzerdefinierte EL-Funktion mehr sauber aber wäre. Beachten Sie, dass das obige Verfahren bei Tomcat 7 und Clones aufgrund extrem restriktiver Einschränkungen erlaubter Eigenschaftsnamen in EL nicht funktioniert. Java reservierte Literale wie class sind nicht mehr erlaubt. Sie würden #{entity['class'].name} und so weiter stattdessen benötigen.

1

Eine andere Möglichkeit ist eine abstrakte Methode in einer Basisklasse zu erstellen, die Sie einige Kennzeichen zurückkehren wird, welche Instanz Sie haben, und es in Ihrem Unterklassen implementieren, wie folgt aus:

public abstract class Person { 

public abstract boolean isPhysical(); 

} 

public PhysicalPerson extends Person { 

public boolean isPhysical() { 
    return true; 
} 

} 

und dann in JSF :

<h:panelGroup rendered="#{entity.physical}"> 
    <p>this is a PhysicalPerson.</p> 
</h:panelGroup> 
<h:panelGroup rendered="#{ not entity.physical}"> 
    <p>this is a Moral Person.</p> 
</h:panelGroup> 

Der Klassenprüfungsansatz ist jedoch universeller.

+0

Dies würde bedeuten, dass Sie jedes Mal, wenn Sie eine neue Implementierung von 'Person' erstellen, ein Getter zur Schnittstelle/abstrakten Klasse hinzufügen müssen. Nicht wirklich nützlich. – BalusC

+0

Boolesches Attribut kann zu jedem anderen geändert werden. aber ich stimme zu, nicht die schönste Lösung. –

Verwandte Themen