Локальный экземпляр tc Server 3.1 завершает бины @ViewScoped и @SessionScoped
ОБНОВИТЬ:
любой @ViewScoped
а также @SessionScoped
жизненные циклы бобов не то, что можно было бы ожидать. То есть они заканчиваются раньше, чем должны. Например, когда выполняется постбэк ajax, когда метод возвращает void, ни @ViewScoped
или же @SessionScoped
бобы должны заканчиваться, но они делают.
После развертывания его в нашей среде разработки и других тестировавших его, кажется, что это происходит только на моей машине и при локальном запуске. Понятия не имею почему. tc Server 3.1 - это то, что используется.
Я оставляю оригинал на тот случай, если кто-то столкнется с проблемой.
Оригинал:
У меня есть дерево, которое заполняется ViewScoped, который считывает данные из файла XML и создает для него объекты TreeNode. Производительность не очень быстрая, поэтому ее создание в представлении является идеальным. (Часть кода была опущена ниже, хотя функциональность работает)
@ManagedBean
@ViewScoped
public class FundsXmlTreeBuilder implements Serializable {
private TreeNode root;
public FundsXmlTreeBuilder() throws SAXException, IOException, ParserConfigurationException {
root = new DefaultTreeNode("Root", null);
buildTree();
}
public void buildTree() throws SAXException, IOException, ParserConfigurationException {
//reads xml file and adds TreeNodes
}
}
Есть еще один компонент RequestScoped, у которого есть метод, который обрабатывает событие ajax для узла дерева, выбранного в методе onNodeSelect. Это в основном определяет, как будет показана другая часть страницы.
@ManagedBean
@RequestScoped
public class FundsXmlDisplay implements Serializable{
private Fund fund;
private FundFamily fundFamily;
private FocusedPortfolioModel model;
public TreeNode selectedRoot;
public FundsXmlDisplay() {
fund = null;
fundFamily = null;
model = null;
selectedRoot = null;
}
public void onNodeSelect(NodeSelectEvent event) {
Object data = event.getTreeNode().getData();
fund = null;
fundFamily = null;
model = null;
if (data instanceof Fund) {
fund = (Fund) data;
} else if (data instanceof FundFamily) {
fundFamily = (FundFamily) data;
} else if (data instanceof FocusedPortfolioModel) {
model = (FocusedPortfolioModel) data;
model.createPieModel();
}
}
}
Вот основные части разметки.
<h:body>
<h:form styleClass="form" id="form1">
*** For Home Office Use Only
<br />
<p:layout id="xmlArea"
style="min-width:400px;min-height:600px;width:95%;">
<p:layoutUnit id="xmlTree" position="west" resizable="false"
closable="false" scrollable="true" size="25%" minSize="40"
maxSize="400" style="padding:.25em;" header="Funds XML Elements">
<p:tree value="#{fundsXmlTreeBuilder.root}" var="node"
dynamic="false" selectionMode="single">
<p:ajax event="select" update=":form1:xmlDisplay"
listener="#{fundsXmlDisplay.onNodeSelect}" />
<p:treeNode>
<h:outputText value="#{node}" style="font-size:small" />
</p:treeNode>
</p:tree>
</p:layoutUnit>
<p:layoutUnit position="center" header="Element Detail" size="75%">
<p:scrollPanel id="xmlDisplay" mode="native"
style="height:100%;">
...
</p:scrollPanel>
</p:layoutUnit>
</p:layout>
</h:form>
</h:body>
Проблема, с которой я сталкиваюсь, заключается в том, что FundsXmlTreeBuilder воссоздается после запуска события ajax, но перед слушателем. Я ожидал бы, что это не будет воссоздано вообще, поскольку, насколько я понимаю, представление не изменяется.
В области xmlDisplay есть довольно много визуализированных атрибутов. Не уверен, что это актуально. Я понимаю, что представление живет, когда метод действия возвращает значение null или void, но я не думаю, что используемые визуализированные методы считаются "методами действия".
Что также интересно, если я изменю FundsXmlTreebuilder на SessionScoped, он будет воссоздан и после выбора узла, что действительно меня озадачило.
Надеюсь, что все ясно и достаточно информации. Спасибо!
1 ответ
В web.xml
, <secure>
тег должен быть закомментирован. Так выглядит соответствующий раздел:
<session-config>
<session-timeout>60</session-timeout>
<cookie-config>
<http-only>true</http-only>
<!-- <secure>true</secure> --> <-- Not be set locally -->
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
Этот тег указывает браузеру отправлять cookie только при передаче по HTTPS, что, как я полагаю, не имеет место при локальном запуске.
Вот где я нашел объяснение. Товарищ по команде обнаружил исправить.