相同的@PostConstruct调用两次,数据无法生存

时间:2014-10-02 22:48:59

标签: jsf-2 primefaces

您好我正在学习JSF / Primefaces。每当用户点击链接时,它应该转发到包含信息的编辑页面,但它是空的。

我尝试调试,发生以下流程:

  • 用户单击要编辑的元素的链接
  • QuoteStatusList.init()被称为
  • QuoteStatusForm.init()被称为
  • QuoteStatusForm.edit被称为
  • QuotestatusForm.quoteStatus bean填充了信息
  • 返回“编辑”
  • foward to quoteStatusForm.xhtml
  • 再次调用
  • 和QuoteStatusForm.init(),所有填充的数据都将丢失

我找到this但我现在只使用jsf注释来管理视图bean

QuoteStatusList.java

@ManagedBean
@RequestScope    
public class QuoteStatusList extends BasePage implements Serializable {
        @PostConstruct
        public void init(){
            log.debug("initing...");
        }
    ...
    }

QuoteStatusForm.java

@ManagedBean
@ViewScope
    public class QuoteStatusForm extends BasePage implements Serializable {
    @PostConstruct
        public void init(){
            log.debug("initing...");
        }

    public String edit() {
            log.debug("editing..");
             if (idQuoteStatus != null && idQuoteStatus != 0) {
                quoteStatus = quoteStatusManager.get(idQuoteStatus);
            } else {
                quoteStatus = new QuoteStatus();
            }  
            return "edit";
        }

    }

BasePage.java

@ManagedBean
@RequestScoped
public class BasePage {
    //nothing is injected
//no other @postConstruct function
}

QuoteStatusList.xhtml

<h:commandLink action="#{quoteStatusForm.edit}" value="#{quoteStatus.idQuoteStatus}">
                        <f:param name="idQuoteStatus" value="#{quoteStatus.idQuoteStatus}"/>
                    </h:commandLink>

faces-config.xml中

 <navigation-rule>
        <from-view-id>/quoteStatusList.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>edit</from-outcome>
            <to-view-id>/quoteStatusForm.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
    <navigation-rule>
        <from-view-id>/quoteStatusForm.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>edit</from-outcome>
            <to-view-id>/quoteStatusForm.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>

1 个答案:

答案 0 :(得分:1)

@RequestScoped@ViewScoped bean您正在经历的适当行为

  1. @RequestScoped - 此范围内的Bean无法在重定向/转发到另一个页面后继续存在。这意味着,如果您在由此作用域的bean支持的页面上,每当您发出新的HTTP请求(ajax,完整页面刷新或重定向)时,该bean的实例都是&# 39;重新工作是被毁坏,无效,不再存在。连同其所有成员变量

  2. @ViewScoped - 此范围内的Bean也无法在完全重定向/转发后继续存在。然而,他们将在页面刷新和ajax中存活下来。这意味着,只要您停留在同一页面(由@ViewScoped bean支持),不返回任何导航案例,您就可以保证使用相同的实例的豆子。


  3. 这些bean应该如何进行通信?如果离开一个页面意味着你丢失了支持bean所包含的所有内容,那么你的选择是什么(你应该问)?好吧,JSF bean可以通过多种方式进行通信。仔细阅读the gospel on inter-bean communication


    那么您的案例中发生了什么

      当您离开它所支持的页面时,
    1. QuoteStatusList列表将被销毁。这也意味着当你回来时,你正在处理该bean的全新实例(以及为什么init被调用两次)

    2. QuoteStatusForm已被销毁,因为您从该bean返回edit,导致您正在使用的实例在页面加载时被销毁并重新创建


    3. 该怎么做:

      为避免销毁QuoteStatusForm,您只需从null

      返回edit即可