Локальный экземпляр 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, что, как я полагаю, не имеет место при локальном запуске.

Вот где я нашел объяснение. Товарищ по команде обнаружил исправить.

Другие вопросы по тегам