Почему @PostConstruct вызывается несколько раз - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь построить объект ConversationScoped, как в следующем примере.Пример взят из книги «Практическая JSF в Java EE 8»:

@Named
@ConversationScoped
public class BookEditor implements Serializable {

    private static final long serialVersionUID = 1L;
    private static Logger logger = Logger.getLogger(BookEditor.class.getName());

    private int counter = 0;

    @Inject
    Conversation _conversation;

    public int getCounter() {
        return counter;
    }

    public void setCounter(int counter) {
        this.counter = counter;
    }

    @PostConstruct
    private void init() {
        logger.info("...init..");
        loadOrCreateBook();
        if (_conversation.isTransient()) {
            _conversation.begin();
            logger.info("...begin conversation..");
        }
    }

    public void count() {
        counter = counter + 1;
        logger.info("...counter=" + counter);
    }

    private void loadOrCreateBook() {
        counter = 0;
    }
}

Цель состоит в том, чтобы этот компонент был инициализирован только один раз на странице.

Пример страницы:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    template="/layout/template.xhtml">

    <ui:define name="content">
        <p>Counter = #{bookEditor.counter}</p>
        <h:form>
            <h:commandLink styleClass="button" value="counter commandLink"
                actionListener="#{bookEditor.count()}"
                action="/pages/bookEditor.xhtml" />
        </h:form>
    </ui:define>
</ui:composition>

Я открываю страницу со ссылкой ../pages/bookEditor.xhtml в своем браузере и нажимаю кнопку несколько раз.Бин создан, и начинается новый разговор.И счетчик увеличивается.Лог-файл выглядит так:

...init..
...begin conversation..
...counter=1
...counter=2
...counter=3

Все хорошо.

Но: Если я размещу информацию счетчика в теге формы, что является типичным случаем использования ...

<ui:define name="content">
    <h:form>
        <p>Counter = #{bookEditor.counter}</p>
        <h:commandLink styleClass="button" value="counter commandLink"
            actionListener="#{bookEditor.count()}"
            action="/pages/bookEditor.xhtml" />
    </h:form>
</ui:define>

... сейчас, если янажмите на кнопку в первый раз, разговор начинается 2 раза.Файл журнала выглядит следующим образом

...init..
...begin conversation..
...init..
...begin conversation..
...counter=1
...counter=2
...counter=3

Почему это происходит?Мне нужно, чтобы избежать второй инициализации.Мое единственное решение пока состоит в том, чтобы избежать использования @ PostConstruct.

...