Как справиться с полиморфизмом с JSF2?

Мне нужно отображать / редактировать полиморфные объекты.

Мой абстрактный класс - человек. Мои конкретные классы - PhysicalPerson и MoralPerson

Каждый конкретный класс имеет свои собственные атрибуты.

Как я могу использовать соответствующий компонент отображения / редактирования (составной) в соответствии с классом сущности?

Спасибо!:)

2 ответа

Там нет такого понятия, как instanceof в EL. Вы можете однако (ab) использовать Object#getClass() и получить доступ к получателям Class в EL также. Затем просто определите результат в компоненте rendered приписывать.

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

Однако пользовательская функция EL была бы более чистой. Обратите внимание, что вышесказанное не работает на Tomcat 7 и клонах из-за крайне ограничительных ограничений разрешенных имен свойств в EL. Зарезервированные литералы Java, такие как class больше не допускаются Вам нужно #{entity['class'].name} и так далее.

Другой способ - создать абстрактный метод в базовом классе, который вернет вам некоторую отметку о том, какой у вас экземпляр, и реализовать его в ваших подклассах, например так:

public abstract class Person {

public abstract boolean isPhysical();

}

public PhysicalPerson extends Person {

public boolean isPhysical() {
     return true;
}

}

а затем в 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>

Однако подход к проверке классов является более универсальным.

Другие вопросы по тегам