1

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

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

@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>

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

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

4

1 回答 1

2

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

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

如果这些字段在 @PostConstruct 注释的方法中初始化,即 init(),在这种情况下(而不是在构造函数中初始化它们,如代码片段所示),除非并且直到用户登录(除非创建一个会话)。

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

有关更多信息,请查看链接,问题已经得到解答:为什么使用@PostConstruct?

于 2013-12-06T23:12:56.213 回答