Как справиться с полиморфизмом с JSF2? - PullRequest
5 голосов
/ 12 ноября 2010

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

Мой абстрактный класс Person .Мои конкретные классы: PhysicalPerson и MoralPerson

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

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

Спасибо!:)

Ответы [ 2 ]

4 голосов
/ 15 ноября 2010

В EL нет такой вещи, как instanceof.Однако вы можете (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} и так далее.

1 голос
/ 19 ноября 2010

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

Однако подход к проверке классов более универсален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...