После просмотра вашей StackTrace и вашего варианта использования (после случайного количества нажатий)
Давайте посмотрим документацию FacesManages.beforeRedirect (как показано вашей StackTrace)
Временно перевести временный разговор в длительный разговор на время переадресации браузера
Теперь давайте посмотрим на фрагмент кода метода beforeRedirect
if (isDifferentConversationId(currentPage, targetPage))
updateCurrentConversationId(targetPage.getConversationId());
...
updateCurrentConversationId отвечает за создание стека , который должен быть не нулевым Еще раз увидеть ваш StackTrace
public void updateCurrentConversationId(String id) {
if (id != null && id.equals(currentConversationId)) {
// The conversation id has not changed, do nothing
return;
}
После кода, показанного выше, ваш стек будет создан. Поэтому я полагаю, Идентификатор разговора не изменился из-за Продолжительность перенаправления браузера (вызванного случайным количеством нажатий) или даже ошибка шва при работе с навигацией с перенаправлением с одной страницы на другую и наоборот
Попробуйте следующее для каждого правила страницы (см. Timeout = "0")
<page view-id="/pageA.xhtml" timeout="0">
<navigation>
<rule if-outcome="showPageB">
<redirect view-id="/pageB.xhtml" />
</rule>
</navigation>
</page>
Полагаю, теперь все работает отлично! Но если нет, то теперь вы знаете, почему вы получаете свое исключение
UPDATE
Попробуйте как обходной путь (для каждой страницы)
<page view-id="/pageA.xhtml">
<navigation>
<rule if-outcome="showPageB">
<end-conversation/>
<redirect view-id="/pageB.xhtml" />
</rule>
</navigation>
</page>
или (см. Перед перенаправлением)
<page view-id="/pageA.xhtml">
<navigation>
<rule if-outcome="showPageB">
<end-conversation before-redirect="true"/>
<redirect view-id="/pageB.xhtml" />
</rule>
</navigation>
</page>
Теперь я надеюсь, что все работает отлично!
EDIT
Как сказано методом beforeRedirect
Временно преобразовать временный разговор в длительный разговор на время перенаправления браузера. После перенаправления разговор будет переведен обратно во временный разговор.
1 ° Это объясняет, почему # {разговор.longRunning} выводит true, когда вы переходите на страницу B. Ваш «длительный разговор», вызванный вашим перенаправлением, должен быть уничтожен после фазы ответа при ответе.
При использовании перенаправления Seam добавляет к URL URL-адрес paratemer.
Книга «Шов в действии» гласит:
В начале жизненного цикла Seam Seam ищет идентификатор разговора в параметре URL
Но поскольку, вернувшись на страницу A, вы снова видите тот же параметр идентификатора разговора , я полагаю Seam просто создайте новый, если в URL-адресе никого нет . А поскольку каждый длительный разговор имеет свой собственный период ожидания, ваш продолжительный разговор сохраняется.
Чтобы проверить, правда ли то, что я сказал, сделайте следующее
- уменьшить глобальный период ожидания до пяти секунд (5000 миллисекунд)
...
<core:manager conversation-timeout="5000"/>
Для каждой страницы смотрите, что выводит # {разговор.timeout}. Я ожидаю увидеть что-то вроде 5 секунд или 5000 миллисекунд. Подождите более 5 секунд (около 10 секунд) и нажмите кнопку для повторного перенаправления. И посмотрите, был ли изменен параметр идентификатора разговора.