多次重构JSF视图作用域Bean

多次重构JSF视图作用域Bean,jsf,jakarta-ee,ejb,view-scope,Jsf,Jakarta Ee,Ejb,View Scope,我认为@ViewScoped应该防止在用户处于同一页面时重构bean。。。那么,为什么我的@ViewScopedJSf控制器bean被多次创建,甚至在操作处理程序导致浏览器离开该视图之前 有人能给我指一下正确的方向吗 这是我的密码: 视图(domain/edit.xhtml) 输出 当我部署它并执行以下操作时,我会得到以下输出: 导航到编辑视图(edit.xhtml) 更改domainDescriptionField输入文本的内容 没有记录 单击“保存” 除非您使用的是JSF2.2(目前还没有

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

有人能给我指一下正确的方向吗

这是我的密码:

视图(domain/edit.xhtml) 输出 当我部署它并执行以下操作时,我会得到以下输出:

  • 导航到编辑视图(edit.xhtml)

  • 更改domainDescriptionField输入文本的内容

    没有记录

  • 单击“保存”


  • 除非您使用的是JSF2.2(目前还没有推出)或MyFaces CODI(我希望您会明确提到),否则
    @ViewScoped
    在CDI中不起作用。这也很符合你的问题症状


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

    在CDI@ViewScoped中,即使在重定向之后,也不会销毁中的ViewScoped Bean。知道问题出在哪里吗?
    <h:form prependId="false">
        <h:inputText id="descriptionField" value="#{domainEdit.domain.description}" />
        <h:commandButton id="saveButton" value="save" action="#{domainEdit.save}" />
    </h:form>
    
    @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";
        }
    }
    
       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...
      pre destroy called.
    
      post construct called.
      displaying domain...
      saving domain...
      pre destroy called.