Как я могу использовать java.util.Set с UIData в JSF.Конкретно h: datatable? - PullRequest
3 голосов
/ 17 февраля 2012

Я знаю, что это не поддерживается в UIData, и я понимаю, почему, но это должно быть распространенной проблемой для людей, использующих JPA и JSF, поскольку наборы являются превосходной коллекцией при отображении отношений M2M O2M.

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

Я полагаю, что ответ заключается в том, чтобы создать ELResolver, чтобы справиться с этим, но структура их и то, как они работают, сбивает меня с толку, и я не понимаю, почему мне нужно было бы писать это, когда это общая проблема, Конечно, кто-то написал ELResolver, чтобы сделать это?

Я нашел эту статью на эту тему, но не могу ее воспроизвести, потому что новая JSF, похоже, не позволяет:

http://techblog.bozho.net/?p=28&cpage=1#comment-13700

А это:

http://www.jroller.com/mert/entry/settolistpropresolver_for_jsf_el

Который полон устаревшего кода, потому что он до ELResolver. Но я просто не могу найти, как реализовать ELResolver для этого. Может кто-нибудь указать мне какой-нибудь работающий код или хотя бы что-нибудь подобное, что поможет мне понять, как использовать ELResolver?

1 Ответ

7 голосов
/ 17 февраля 2012

Что-то проще, поддержка Set (на самом деле, всего интерфейса Collection) в DataModel доступна доступна в JSF 2.2 . В настоящее время он уже доступен как снимок , так что вы можете просто начать разработку. Он выйдет около Q2.


Обновление : что касается комментариев, похоже, что оно не совсем гладко работает с Spring Web Flow. Оказывается, он не совместим с JSF 2.2 (и изначально также не совместим с JSF 2.1). Ну, лучше всего подойдет ELResolver.

Проще всего расширить ListELResolver следующим образом:

public class SetToListELResolver extends ListELResolver {

    public static final String KEY_PROPERTY = "setToList";

    @Override
    public Object getValue(ELContext context, Object base, Object property) {
        if (base instanceof Set<?> && KEY_PROPERTY.equals(property)) {
            context.setPropertyResolved(true);
            return new ArrayList<Object>((Set<?>) base);
        }

        return super.getValue(context, base, property);
    }

}

Если вы зарегистрируете его следующим образом в faces-config.xml

<application>
    <el-resolver>com.example.SetToListELResolver</el-resolver>
</application>

, тогда вы сможете использовать его в синтаксисе #{bean.set.setToList}, где .setToList является специальным свойством, которое запускает преобразование:

<h:dataTable value="#{bean.set.setToList}" ...>

Это фактически закончится в вымышленном

<h:dataTable value="#{new ArrayList(bean.set)}" ...>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...