JSF中的会话范围bean和@PostConstruct

JSF中的会话范围bean和@PostConstruct,jsf,primefaces,jsf-2.2,session-scope,postconstruct,Jsf,Primefaces,Jsf 2.2,Session Scope,Postconstruct,这是一个非常简单和直截了当的问题 我有一个会话范围的托管bean,如下所示(演示一个PrimeFaces) 上述会话范围的托管bean中给定的两个字段绑定到一个XHTML页面 <h:form id="rangeForm" prependId="true"> <p:panel header="Shop by Price"> <h:panelGrid id="rangeSliderPanelGrid" columns="1" style="mar

这是一个非常简单和直截了当的问题

我有一个会话范围的托管bean,如下所示(演示一个PrimeFaces)

上述会话范围的托管bean中给定的两个字段绑定到一个XHTML页面

<h:form id="rangeForm" prependId="true">
    <p:panel header="Shop by Price">
        <h:panelGrid id="rangeSliderPanelGrid" columns="1" style="margin-bottom:10px">
            <h:outputText id="displayRange" value="Min : #{rangeSliderBean.minPrice.toPlainString()} Max : #{rangeSliderBean.maxPrice.toPlainString()}"/>

            <p:slider for="txtMinPrice, txtMaxPrice" 
                      minValue="#{rangeSliderBean.minPrice}" 
                      maxValue="#{rangeSliderBean.maxPrice}" 
                      display="displayRange" 
                      style="width:170px" 
                      range="true" displayTemplate="Min : {min} Max : {max}"/>
        </h:panelGrid>

        <h:inputHidden id="txtMinPrice" value="#{rangeSliderBean.minPrice}" converter="#{bigDecimalConverter}"/>
        <h:inputHidden id="txtMaxPrice" value="#{rangeSliderBean.maxPrice}" converter="#{bigDecimalConverter}"/>
        <p:commandButton value="Submit"/> <!--Update/process is temporarily omitted.-->
    </p:panel>
</h:form>

如果这些字段是在
@PostConstruct
注释的方法中初始化的,即
init()
,在这种情况下(而不是在构造函数中初始化它们,如代码段所示),除非用户登录(除非创建了会话),否则不会设置它们的指定值

那么,如何在构造函数中初始化它们呢,只是有点混乱?(我知道构造函数是在调用
@PostConstruct
注释的方法之前调用的)

那么,如何在构造函数中初始化它们呢 混乱(我知道构造函数是在方法之前调用的 调用@PostConstruct注释)

仅使用
@PostConstruct
init
方法初始化正在注入的字段(即EJB)。如果您没有任何注入和依赖项,
init
方法将变得非常无用。bean的构造函数用于初始化bean自己的属性。在您的示例中,您没有任何注入,因此可以安全地删除
@PostConstruct
init
方法

如果这些字段在注释为的方法中初始化 @PostConstruct,即init(),在本例中(而不是初始化它们 在构造函数中(如代码段所示),它们的指定值 除非和直到用户登录,否则不会设置(除非会话 创建)

这是正常的行为,没有理由强调而不是,因为只有在创建新会话时才会创建并初始化
@SessionScoped
bean


有关更多信息,请查看链接,问题已经回答:

如果这些字段是在
@PostConstruct
注释的方法中初始化的,即
init()
(…)除非用户登录,否则不会设置它们的指定值。请注意,在创建托管bean和注入其他组件(如EJB)后,将调用由
@PostConstruct
注释的方法。否则,您能否提供这种奇怪行为的示例?“创建托管bean后将调用由
@PostConstruct
注释的方法”。这与调用构造函数后将调用由
@PostConstruct
注释的方法相同。“…以及注入其他组件(如EJB)后”。这也发生在构建托管bean之后(即构造函数完成其工作之后)。我无法想象另一个例子:)。我的意思是:使用
@SessionScoped
托管bean发布一个有效的JSF/Facelets代码,该bean演示了如果这些字段在
@PostConstruct
方法中初始化,而不是在类构造函数中初始化,则这些字段是空的。请注意,只能发布一个
@SessionScoped
bean仅当手动创建或从视图中引用会话时,才创建每个会话。实际上,它不是在会话开始时自动创建的。只有在创建新会话时才会创建和初始化您的语句
可能会被理解为错误。在发布此帖子很久之后进行了某些更改后,问题正文中显示的问题将无法重现。因此,我不确定问题的确切根源。也许某些AJAX请求是罪魁祸首。谢谢
<h:form id="rangeForm" prependId="true">
    <p:panel header="Shop by Price">
        <h:panelGrid id="rangeSliderPanelGrid" columns="1" style="margin-bottom:10px">
            <h:outputText id="displayRange" value="Min : #{rangeSliderBean.minPrice.toPlainString()} Max : #{rangeSliderBean.maxPrice.toPlainString()}"/>

            <p:slider for="txtMinPrice, txtMaxPrice" 
                      minValue="#{rangeSliderBean.minPrice}" 
                      maxValue="#{rangeSliderBean.maxPrice}" 
                      display="displayRange" 
                      style="width:170px" 
                      range="true" displayTemplate="Min : {min} Max : {max}"/>
        </h:panelGrid>

        <h:inputHidden id="txtMinPrice" value="#{rangeSliderBean.minPrice}" converter="#{bigDecimalConverter}"/>
        <h:inputHidden id="txtMaxPrice" value="#{rangeSliderBean.maxPrice}" converter="#{bigDecimalConverter}"/>
        <p:commandButton value="Submit"/> <!--Update/process is temporarily omitted.-->
    </p:panel>
</h:form>