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.