JSF View Scoped Bean 多次重构

标签 jsf jakarta-ee ejb view-scope

<分区>

我认为 @ViewScoped 应该防止用户在同一页面上时重构 bean... 那么为什么我的 @ViewScoped JSf Controller bean甚至在操作处理程序导致浏览器离开该 View 之前就被多次创建?

谁能给我指出正确的方向?

这是我的代码:

View (域/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 Controller (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. 导航到编辑 View (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.

最佳答案

除非您使用的是 JSF 2.2(目前尚未发布)或 MyFaces CODI(我希望您会明确提及),否则 @ViewScoped 不会在 CDI 工作。这也非常符合您的问题症状。

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

关于JSF View Scoped Bean 多次重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14812238/

相关文章:

java - 从 JSF 中的 EJB 处理验证错误

java - EJB 仍然有用吗? Spring Framework 有哪些替代 EJB 的方法?

java - 同一 JVM 中的远程 EJB 调用与本地 EJB 调用性能

JSF URL 重写

ajax - 标签库支持命名空间 : http://java. sun.com/jsf/core,但没有为名称定义标签:ajax

jakarta-ee - 当数据库中的某些内容被修改时,通过 WebSockets 仅通知特定用户

mysql - EJB/Hibernate 不访问 MySQL 数据库

hibernate - 对象引用未保存的 transient 实例 - 在刷新 Hibernate 之前保存 transient 实例

java - JSF EL 条件

java - 行间列数不同的 JSF 表