2013-12-06 3 views
1

Простой и прямой вопрос.Сессионные бобы и @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).

+0

* Если эти поля инициализируются в методе аннотированных с помощью '@ PostConstruct' т.е.' Init() '(...) Указанных значения не устанавливаются, пока и до тех пор, пока пользователь не войдет в систему *, обратите внимание, что метод, созданный аннотацией '@ PostConstruct', будет вызван после создания управляемого компонента и после инъекции других компонентов, например EJBs. Не могли бы вы привести пример этого нечетного поведения? –

+0

«* метод, аннотированный' @ PostConstruct', будет вызываться после создания управляемого компонента *. Это то же самое, что сказать, что метод, аннотированный '@ PostConstruct', будет вызываться после вызова конструктора. "* ... и после инъекции других компонентов, например EJBs *". Это также происходит после создания управляемого компонента (т. Е. После завершения работы конструктора). Я не вижу другого примера :). – Tiny

+0

Я имею в виду: отправить действительный код JSF/Facelets с помощью управляемого компонента '@ SessionScoped', который демонстрирует эти поля, пустые, если они инициализируются в методе' @ PostConstruct', а не инициализируются в конструкторе класса. –

ответ

2

Как они могут быть инициализированы в конструкторе, а затем немного путаница? (Я знаю, что конструктор вызывается до того, как вызывается метод , аннотированный с помощью @PostConstruct).

Используйте init метод @PostConstruct «ы только для инициализации полей, которые впрыскивают (т.е. EJBs). Если у вас нет инъекций и зависимостей, метод init становится довольно бесполезным. Конструктор bean используется для инициализации собственных свойств bean. В вашем примере у вас нет инъекции, поэтому вы можете безопасно удалить этот метод init.

Если эти поля инициализируются в методе аннотированный по @PostConstruct т.е. Init(), в этом случае (вместо того, чтобы инициализировать их в конструкторе, как показано на фрагменте кода), их значения, указанные являются не установить, пока и пока пользователь не войдет в систему (если не создан сеанс ).

Это нормальное поведение, нет никаких причин, чтобы подчеркнуть на не, поскольку @SessionScoped компонент создается и инициализируется только тогда, когда создается новая сессия.

Для получения дополнительной информации проверить ссылку, вопрос уже был дан ответ: Why use @PostConstruct?

+0

Обратите внимание, что за сеанс может быть создан только один компонент '@ SessionScoped' **, только если вы создадите его вручную или ссылаетесь на него из представления **. ** Фактически он не создается автоматически при начале сеанса **. Ваш оператор 'создается и инициализируется только тогда, когда создается новый сеанс', который можно понимать как ошибочный. –

+0

После того, как после публикации были сделаны некоторые изменения, проблема, продемонстрированная в органе вопросов, не может быть воспроизведена. Поэтому я не уверен в точной первопричине проблемы. Возможно, некоторые определенные просьбы AJAX были виновниками. Благодарю. – Tiny

Смежные вопросы