Как справиться с полиморфизмом с 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>
Однако подход к проверке классов является более универсальным.