Я пытаюсь построить объект 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.