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

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

Например :

Мое веб-приложение содержит поток с именем «создать», который позволяет создать запись в базе данных. Я хотел бы иметь возможность ввести 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>

Создать контроллер

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 "Панель запуска"

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

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


person Aki    schedule 03.12.2014    source источник
comment
Вам нужно опубликовать пример кода   -  person pquest    schedule 03.12.2014
comment
Я обновил свой первоначальный пост.   -  person Aki    schedule 04.12.2014


Ответы (1)


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

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

person lu4242    schedule 13.12.2014