2010-11-12 11 views
5

Necesito mostrar/editar entidades polimórficas.¿Cómo manejar el polimorfismo con JSF2?

Mi clase abstracta es Persona. Mis clases concretas son PhysicalPerson y MoralPerson

Cada clase concreta se atribuye su propia medida.

¿Cómo puedo usar el componente apropiado de visualización/edición (compuesto) de acuerdo con la clase de entidad?

Gracias! :)

Respuesta

4

No existe tal cosa como instanceof en EL. Sin embargo, puede (ab) utilizar Object#getClass() y acceder a los buscadores de Class en EL también. Luego solo determine el resultado en el atributo rendered del componente.

<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> 

Una costumbre función EL sería más limpia, sin embargo. Tenga en cuenta que lo anterior no funciona en Tomcat 7 y clones debido a las restricciones extremadamente restrictivas de los nombres de propiedad permitidos en EL. Los literales reservados de Java como class ya no están permitidos. Necesitaría #{entity['class'].name} y así sucesivamente.

1

Otra forma es crear un método abstracto en una clase base, que le devolverá alguna marca de lo instancia que tiene, y ponerlo en práctica en sus subclases, así:

public abstract class Person { 

public abstract boolean isPhysical(); 

} 

public PhysicalPerson extends Person { 

public boolean isPhysical() { 
    return true; 
} 

} 

y luego en 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> 

Sin embargo, el enfoque de comprobación de clases es más universal.

+0

Esto implicaría que necesita agregar un getter a la clase interfaz/abstracta cada vez que cree una nueva implementación de 'Persona'. No es realmente útil. – BalusC

+0

atributo booleano se puede cambiar a cualquier otro. pero estoy de acuerdo, no es la solución más hermosa. –