WELD-001303 Нет активных контекстов для типа области видимости javax.faces.flow.FlowScoped при прямом доступе

Я играю с JSF 2.2 (реализация MyFaces v2.2.6 и Weld v2.2.7.Final для CDI) с начала недели, и у меня возникает следующая проблема: я не могу напрямую получить доступ к точке входа потока с моим братом,

Например:

Мое веб-приложение содержит поток с именем "create", который позволяет создавать записи в базе данных. Я хотел бы иметь возможность ввести URL http://my.domain/webapp/create/create.jsf в адресной строке моего браузера.

Когда я это делаю, страница не отображается правильно, и на сервере появляется следующий журнал

log: WELD-001303 Нет активных контекстов для типа области javax.faces.flow.FlowScoped.

Что я делаю неправильно? Разве это не возможно? Я надеюсь, что это должно!

У меня нет проблем, когда я создаю страницу вне потока, имеющую только одну commandButton, перенаправляющую на точку входа в поток. Когда я смотрю исходный код, кажется, что идентификатор для потока уже создан, несмотря на то, что к потоку еще не обращались. Это заставляет меня думать, что FlowScoped плохо спроектирован. Более того, такая работа (страница запуска) нарушает мой собственный дизайн и восприятие конечным пользователем.

Какие есть доступные решения?

Вот пример кода:

Create.xhtml

<h1>Create record</h1>
<h:form id="create-record" prependId="false">
    <label for="name">Name</label>
    <h:inputText id="name" value="#{createController.name}" />
    <h:commandButton title="Abandon" value="Abandon" id="abandon" action="returnFromCreate" immediate="true" />
    <h:commandButton title="Validate" value="Validate" id="validate" action="#{createController.create()}" />
</h:form>

CreateController

package my.company;

import java.io.Serializable;

import javax.faces.flow.FlowScoped;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@FlowScoped("create")
public class CreateController implements Serializable {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String create() {
        // TODO
        return "returnFromCreate";
    }
}

xhtml "Launcher"

<h:form>
    <h:commandButton action="create" value="Go" />
</h:form>

create-flow.xml содержит только директиву flow-return.

1 ответ

Это исключение означает, что вы перешли на страницу, но вы не находитесь внутри потока. Вы должны проверить, действительно ли ссылка входит в поток, но перед этим проверьте, включен ли api окна клиента (javax.faces.CLIENT_WINDOW_MODE), потому что поток граней зависит от этой функции. MyFaces 2.2. Реализация Faces Flow работает очень хорошо, даже в таких сложных ситуациях, как вложенные потоки, с которыми реализация из Mojarra не может справиться, и соответствует спецификациям.

В живом сериале JSF 2.2 от Michael Kurz Blog есть несколько хороших примеров о возможностях JSF 2.2. Примеры работают как для реализаций JSF, так и для MyFaces и Mojarra. Проверьте пример для Faces Flow на Github jsflive.

Другие вопросы по тегам