本地tc Server 3.1实例结束@ViewScoped和@SessionScoped bean

Local tc Server 3.1 instance ends @ViewScoped and @SessionScoped beans

更新:

任何 @ViewScoped@SessionScoped bean 的生命周期都不是预期的。也就是说,它们结束的比预期的要早。例如,当 ajax 回发完成时 returns void 方法 @ViewScoped@SessionScoped beans 都不应该结束,但它们确实会结束。

将其部署到我们的开发环境并由其他人对其进行测试后,它似乎只发生在我的机器上并且在本地 运行。不知道为什么。正在使用的是 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 bean,它有一个方法可以处理在 onNodeSelect 方法中选择树节点的 ajax 事件。它基本上决定了页面的另一部分将如何显示。

@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区域中有不少渲染属性。不确定这是否相关。我知道当操作方法 returns 为空或无效时,视图仍然存在,但我不认为使用的渲染方法算作 "action methods".

同样有趣的是,如果我将 FundsXmlTreebuilder 更改为 SessionScoped,它也会在选择一个节点后重新创建,这确实让我很困惑。

希望一切都清楚并提供足够的信息。谢谢!

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>

此标记告诉浏览器仅在 HTTPS t运行smission 上发送 cookie,我认为 运行 在本地时不会出现这种情况。

这是我找到 the explanation 的地方。队友发现了修复。