Простой и прямой вопрос.Сессионные бобы и @PostConstruct в JSF
У меня есть обработанный сеансом управляемый 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
}
Данные два поля в приведенном выше сеансе управляемых компонентов привязаны к странице 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' т.е.' Init() '(...) Указанных значения не устанавливаются, пока и до тех пор, пока пользователь не войдет в систему *, обратите внимание, что метод, созданный аннотацией '@ PostConstruct', будет вызван после создания управляемого компонента и после инъекции других компонентов, например EJBs. Не могли бы вы привести пример этого нечетного поведения? –
«* метод, аннотированный' @ PostConstruct', будет вызываться после создания управляемого компонента *. Это то же самое, что сказать, что метод, аннотированный '@ PostConstruct', будет вызываться после вызова конструктора. "* ... и после инъекции других компонентов, например EJBs *". Это также происходит после создания управляемого компонента (т. Е. После завершения работы конструктора). Я не вижу другого примера :). – Tiny
Я имею в виду: отправить действительный код JSF/Facelets с помощью управляемого компонента '@ SessionScoped', который демонстрирует эти поля, пустые, если они инициализируются в методе' @ PostConstruct', а не инициализируются в конструкторе класса. –