2

我认为@ViewScoped应该防止 bean 在用户位于同一页面时被重建......那么为什么我的@ViewScopedJSf 控制器 bean 甚至在动作处理程序导致浏览器导航离开该视图之前被多次创建?

谁能在这里指出我正确的方向?

这是我的代码:

视图(域/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 中不起作用。这也非常符合您的问题症状。

通过 JSF 而不是 CDI 管理 bean。替换@Named("domainEdit")@ManagedBeanjavax.faces.bean包中。或者,安装 MyFaces CODI 以将 JSF 桥@ViewScoped接到 CDI。

于 2013-02-11T13:34:11.767 回答