週の初めから JSF 2.2 (MyFaces 実装 v2.2.6 および CDI の Weld v2.2.7.Final) で遊んでいますが、次の問題に直面しています。弟と一緒にフロー エントリ ポイントに直接アクセスできません。 .
例えば :
私の webapp には、データベースにレコードを作成することを許可する「作成」という名前のフローが含まれています。http://my.domain/webapp/create/create.jsfブラウザのアドレス バーにURL を入力できるようにしたいと考えています。
そうすると、ページが正しくレンダリングされず、次のログがサーバーに表示されます
ログ : WELD-001303 スコープ タイプ javax.faces.flow.FlowScoped のアクティブなコンテキストがありません。
私は何を間違っていますか?それは可能であるべきではありませんか?私はそれがあることを願っています!
フローの外部で、フロー エントリ ポイントにリダイレクトする commandButton が 1 つしかないページを作成しても問題はありません。ソース コードを見ると、フローがまだアクセスされていないにもかかわらず、フローの ID が既に作成されているようです。そのため、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「ランチャー」
<h:form>
<h:commandButton action="create" value="Go" />
</h:form>
create-flow.xml には「flow-return」ディレクティブのみが含まれます。