0

アップデート:

Any@ViewScopedおよび@SessionScopedBean のライフサイクルは、予期されるものではありません。つまり、必要以上に早く終了しています。たとえば、メソッドが void を返す場所で ajax ポストバックが行われた場合、@ViewScopedまたは@SessionScopedBean は終了する必要がありますが、終了します。

それを私たちの開発環境にデプロイし、他の人がそれをテストした後、それは私のマシンでローカルに実行されたときにのみ発生するようです. 理由はわかりません。tc Server 3.1 が使用されています。

誰かが同様の問題に遭遇した場合に備えて、オリジナルを残しています。

オリジナル:

XML ファイルからデータを読み取り、それに対応する TreeNode オブジェクトを作成する ViewScoped によって生成されるツリーがあります。パフォーマンスはそれほど高速ではないため、ビューで一度作成するのが理想的です。(一部のコードは以下で省略されていますが、機能は動作します)

@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
    }
}

onNodeSelect メソッドで選択されているツリー ノードの ajax イベントを処理するメソッドを持つ別の RequestScoped Bean があります。基本的に、ページの別の部分がどのように表示されるかを決定します。

@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>

私が抱えている問題は、ajax イベントが発生した後、リスナーの前に FundsXmlTreeBuilder が再作成されることです。私が理解していることから、ビューは変更されていないため、まったく再作成されないと予想されます。

xmlDisplay 領域にはかなりの数のレンダリングされた属性があります。それが関連しているかどうかはわかりません。アクション メソッドが null または void を返したときにビューが有効であることは理解していますが、使用されているレンダリングされたメソッドは「アクション メソッド」としてカウントされないと思います。

また興味深いのは、FundsXmlTreebuilder を SessionScoped に変更すると、ノードを選択した後にも再作成されることです。

すべてが明確で、十分な情報が提供されることを願っています。ありがとう!

4

1 に答える 1

0

では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 送信でのみ Cookie を送信するようにブラウザに指示します。これは、ローカルで実行された場合には当てはまらないと思います。

これは私が説明を見つけた場所です。チームメイトが修正を発見しました。

于 2016-01-21T13:52:28.907 に答える