2

@ViewScopedユーザーが同じページにいるときにBeanが再構築されないようにする必要があると思っていました...では@ViewScoped、アクションハンドラーによってブラウザーがそのビューから移動する前に、JSfコントローラーBeanが複数回作成されるのはなぜですか?

誰かが私をここで正しい方向に向けることができますか?

これが私のコードです:

ビュー(domain / edit.xhtml)

<h:form prependId="false">
    <h:inputText id="descriptionField" value="#{domainEdit.domain.description}" />
    <h:commandButton id="saveButton" value="save" action="#{domainEdit.save}" />
</h:form>

ViewScopedコントローラー(DomainEdit.java)

@Named("domainEdit")
@ViewScoped
public class DomainEdit implements Serializable {

    private static final long serialVersionUID = 1L;


    protected DomainEdit() {
    }

    @PostConstruct
    protected void init() {
        System.out.println("post construct called.");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("pre destroy called.");
    }

    public DomainEntity getDomain() {
        System.out.println("displaying domain...");

        // some code to return the domain
        return domain;
    }

    public String save() {
        System.out.println("saving...");

        // some saving code

        return "view";
    }
}

出力

これをデプロイして次のように実行すると、次の出力が得られます。

  1. 編集ビュー(edit.xhtml)に移動します

       post construct called.
       displaying domain...
       pre destroy called.
    
  2. domainDescriptionField入力テキストの内容を変更します

    何も記録されません

  3. [保存]をクリックします

  post construct called.
  displaying domain...
  pre destroy called.

  post construct called.
  displaying domain...
  pre destroy called.

  post construct called.
  displaying domain...
  pre destroy called.

  post construct called.
  displaying domain...
  pre destroy called.

  post construct called.
  displaying domain...
  saving domain...
  pre destroy called.
4

1 に答える 1

8

JSF 2.2(現時点ではまだリリースされていません)またはMyFaces CODI(明示的に言及することを期待していました)を使用して@ViewScopedいない限り、CDIでは機能しません。これも問題の症状とほぼ一致します。

CDIではなくJSFでBeanを管理します。パッケージ@Named("domainEdit")から置き換えます@ManagedBeanjavax.faces.beanまたは、MyFaces CODIをインストールして、JSF@ViewScopedをCDIにブリッジします。

于 2013-02-11T13:34:11.767 に答える