Session d'étendue de haricots et @PostConstruct dans JSF

Un très simple et straight-forward question.

J'ai une session d'étendue de managed bean comme suit (en démontrant une PrimeFaces curseur de plage).

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

La donnée de deux champs dans la session d'étendue de managed bean sont liés à une page 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>

Si ces champs sont initialisés dans la méthode annotée par @PostConstruct je.e init(), dans ce cas (au lieu de l'initialisation dans le constructeur comme le montre l'extrait), leurs valeurs indiquées sont des valeurs pas, à moins et jusqu'à ce qu'un utilisateur se connecte (sauf si une session est créée).

Comment peuvent-ils être initialisé dans le constructeur puis, juste un peu de confusion? (Je sais que le constructeur est appelé avant que la méthode annotée par @PostConstruct est invoquée).

  • Si ces champs sont initialisés dans la méthode annotée par @PostConstruct je.e init() (...) leurs valeurs spécifiées ne sont pas définies, à moins que et jusqu'à ce qu'un utilisateur se connecte à noter que la méthode annotée par @PostConstruct sera appelé après la création du managed bean et après l'injection d'autres composants, par exemple les Ejb. Pourriez-vous, sinon, donner un exemple de ce comportement étrange?
  • "la méthode annotée par @PostConstruct sera appelé après la création du managed bean". C'est la même chose que de dire, la méthode annotée par @PostConstruct sera appelée après que le constructeur a été appelé. "...et après l'injection d'autres composants, par exemple les Ejb". Cela se produit également après le managed bean est construit (c'est à dire après que le constructeur a terminé son travail). Je ne peux pas visualiser un autre exemple :).
  • Je veux dire: par la poste valide JSF/Facelets code à l'aide de votre @SessionScoped managed bean qui démontre ces champs sont vides si elles sont initialisées dans le @PostConstruct méthode au lieu d'être initialisé dans le constructeur de la classe.
InformationsquelleAutor Tiny | 2013-12-06