【问题标题】:Session scoped beans and @PostConstruct in JSFJSF 中的会话范围 bean 和 @PostConstruct
【发布时间】:2013-12-06 21:04:22
【问题描述】:

一个非常简单直接的问题。

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

@ManagedBean
@SessionScoped
public final class RangeSliderBean implements Serializable
{
    private static final long serialVersionUID = 1L;
    private static final byte scale=2;

    private BigDecimal maxPrice;
    private BigDecimal minPrice;

    public RangeSliderBean()
    {
        maxPrice=new BigDecimal(100).setScale(scale, RoundingMode.HALF_UP);
        minPrice=new BigDecimal(5).setScale(scale, RoundingMode.HALF_UP);
    }

    @PostConstruct
    private void init()
    {

    }

    //Mutators and accessors
}

上述会话范围的托管 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(),在这种情况下(而不是在构造函数中初始化它们,如sn-p所示),它们的指定值是not 设置除非和直到用户登录(除非创建会话)。

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

【问题讨论】:

  • 如果这些字段在 @PostConstruct 注释的方法中初始化,即 init() (...) 除非用户登录,否则不会设置它们的指定值请注意,@PostConstruct 注释的方法将在创建托管 bean 和注入其他组件之后调用,例如EJB。否则,您能否举例说明这种奇怪的行为?
  • "@PostConstruct 注释的方法将在创建托管 bean 后调用"。这就是说,被@PostConstruct注解的方法将在构造函数被调用之后被调用。 “...在注入其他组件之后,例如 EJB”。这也发生在托管 bean 构建之后(即构造函数完成其工作之后)。我无法想象另一个例子:)。
  • 我的意思是:使用您的 @SessionScoped 托管 bean 发布一个有效的 JSF/Facelets 代码,证明如果这些字段在 @PostConstruct 方法中初始化而不是在类构造函数中初始化,则它们是空的。

标签: jsf primefaces jsf-2.2 session-scope postconstruct


【解决方案1】:

那么如何在构造函数中初始化它们,就一点点 困惑? (我知道构造函数是在方法之前调用的 由@PostConstruct 注释的被调用)。

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

如果这些字段在被注解的方法中初始化 @PostConstruct 即 init(),在这种情况下(而不是初始化它们 在构造函数中如sn -p),它们的指定值 被设置,除非并且直到用户登录(除非会话是 创建)。

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

欲了解更多信息,请查看链接,问题已得到解答:Why use @PostConstruct?

【讨论】:

  • 请注意,每个会话只能创建一个@SessionScoped bean仅当您手动创建它或从视图中引用它时实际上它不是在会话开始时自动创建的。您的声明is created and initialized only when a new session is created 可能被理解为错误的。
  • 在发布此帖子很久之后进行了某些更改后,问题正文中显示的问题无法重现。因此,我不确定问题的确切根本原因。也许某些 AJAX 请求是罪魁祸首。谢谢。
猜你喜欢
  • 2014-07-17
  • 2011-09-02
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多