一个非常简单明了的问题。
我有一个会话范围的托管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()
,在这种情况下(而不是在构造函数中初始化它们,如代码段中所示),它们的指定值为不设置,除非并且直到用户登录(除非创建会话)。
那么如何在构造函数中初始化它们,只是有点混乱? (我知道在调用@PostConstruct
注释的方法之前调用构造函数。)
答案 0 :(得分:2)
如何在构造函数中初始化它们,只是一点点 混乱? (我知道在方法之前调用构造函数 调用@PostConstruct注释。)
仅使用@PostConstruct
的{{1}}方法初始化正在注入的字段(即Ejbs)。如果您没有任何注入和依赖,init
方法变得毫无用处。 bean的构造函数用于初始化bean自己的属性。在您的示例中,您没有任何注入,因此您可以安全地删除init
的{{1}}方法。
如果在注释方法中初始化这些字段 @PostConstruct即init(),在这种情况下(而不是初始化它们) 在构造函数中,如代码片段所示),它们的指定值 是不设置,除非并且直到用户登录(除非会话是 创建)。
这是正常行为,没有理由强调不,因为只有在创建新会话时才创建并初始化@PostConstruct
bean。
有关详细信息,请查看该链接,问题已经得到解答:Why use @PostConstruct?