Устойчивость основных компонентов в Spring Webflow - PullRequest
0 голосов
/ 23 марта 2012

У меня проблемы с постоянством компонентов простых лиц в Spring Webflow.Если компоненты создаются как часть исходного запроса страницы, все работает нормально.Однако, если компоненты создаются во время ajax-запроса, они не сохраняются правильно, и при последующем их получении мы получаем пустой объект.В результате, например, компоненты на второй вкладке в виде вкладок (с динамическим = true) не работают.Пример:

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

    <h:head>
        <ui:insert name="headIncludes" />
    </h:head>
    <h:body>
        <h:form id="testForm">
            <p:tabView id="myTabView" dynamic="true">
                <p:tab title="Tab One" id="tabOne">
                    <h:panelGroup id="tabOneGroup">
                        <p:commandLink id="linkX" value="Link X" actionListener="#{sandboxBean.testCommandLinkx}" >
                            <f:ajax />
                        </p:commandLink>
                    </h:panelGroup>
                </p:tab>
                <p:tab title="Tab Two" id="tabTwo">
                    <h:panelGroup id="tabTwoGroup">
                        <p:commandLink id="linkY" value="Link Y" actionListener="#{sandboxBean.testCommandLinky}" >
                            <f:ajax /><!-- Only matters if we switch to h:commandLink -->
                        </p:commandLink>
                    </h:panelGroup>
                </p:tab>
            </p:tabView>
        </h:form>
    </h:body>
</html>

При первой загрузке страницы создается экземпляр UIComponent, представляющий ссылку linkX команды, и сохраняется значение атрибута для actionListener.Когда мы нажимаем «Ссылка X», это значение атрибута снова извлекается и используется для вызова testCommandLinkx ().Это отлично работает.

Когда мы переключаемся на Tab Two, делается запрос ajax, и во время этого другой UIComponent, представляющий linkY, создается таким же образом и сохраняется.Однако, когда мы на самом деле нажимаем на командную ссылку и пытаемся получить значение атрибута actionListener, мы обнаруживаем, что такого атрибута нет.Вместо этого мы получаем совершенно новый объект.

Если мы изменим на dynamic = "false" для tabView, обе командные ссылки создаются и сохраняются во время начального запроса страницы, и все работает нормально.Если мы сохраняем dynamic = "true", но используем ah: commandLink вместо ap: commandLink, все также работает нормально.

Теперь я не думаю, что это ошибка с простыми лицами, как если бы это были тонныдругие бы тоже это заметили.Другие люди также протестировали этот конкретный фрагмент кода без проблем.По той же причине я сомневаюсь, что это ошибка веб-потока.Скорее всего, это ошибка конфигурации в нашем проекте, но я понятия не имею, где.Кажется немного длинным включение каждого файла конфигурации, но если вы хотите увидеть содержимое одного комментария, и я добавлю его.

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

  • Primefaces: 3.0.1 и все более поздние версии для динамических tabViews (поскольку это была первая версия, поддерживающая ее по-настоящему), но ее можно воссоздать в более ранних версиях, если вы используете другую конструкцию, которая создает компоненты в ajaxзапросы.
  • Мохарра: 2.0.4 (но я также пробовал 2.0.8 и 2.1.6 без улучшений)
  • Spring Webflow: 2.2.1 (также пробовал 2.3)
  • Tomcat: 7.0.12 (пробовал и другие)

1 Ответ

0 голосов
/ 02 апреля 2012

Эта проблема является ошибкой в ​​Spring WebFlow и фактически исправлена ​​в 2.3.1, которая была выпущена 27 марта.

...